Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F109902042
D39992.id121636.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D39992.id121636.diff
View Options
diff --git a/tools/tools/git/git-arc.sh b/tools/tools/git/git-arc.sh
--- a/tools/tools/git/git-arc.sh
+++ b/tools/tools/git/git-arc.sh
@@ -51,7 +51,7 @@
Commands:
create [-l] [-r <reviewer1>[,<reviewer2>...]] [-s subscriber[,...]] [<commit>|<commit range>]
list <commit>|<commit range>
- patch <diff1> [<diff2> ...]
+ patch -c <diff1> [<diff2> ...]
stage [-b branch] [<commit>|<commit range>]
update [-m message] [<commit>|<commit range>]
@@ -133,6 +133,11 @@
$ git arc patch D12345
+ Apply the patch in review D12345 to the currently checked-out tree, and
+ commit it using the review's title, summary and author
+
+ $ git arc patch -c D12345
+
List the status of reviews for all the commits in the branch "feature":
$ git arc list main..feature
@@ -455,18 +460,150 @@
done
}
+gitarc_default_email()
+{
+ local addr name
+
+ addr=$1
+ name=$2
+ printf "%s <%s>\n" "${name}" $(echo "$addr" | sed -e 's/\(.*\)_/\1@/')
+}
+
+# Try to guess our way to a good author name. The DWIM is strong in this
+# function, but these hueristics seem to generally produce the right results, in
+# the sample of src commits I checked out.
+gitarc_find_author()
+{
+ local addr name email
+
+ addr="$1"
+ name="$2"
+
+ # The lovely and almost, but really really annoyingly not quite, phab
+ # interface gives us almost enough data to create an author, but sadly not
+ # quite. So we play whack-a-mole with heuristics to come up with something
+ # one hopefully calls 'a sane set of defaults'.
+
+ # Choice 1: It's a FreeBSD commiter. These folks have no '.' in their
+ # phab username/addr
+ case "$addr" in
+ *.*) ;; # external user
+ *)
+ echo "$name <$addr@FreeBSD.org>"
+ return
+ ;;
+ esac
+
+ # Choice 2: We know this user. They've committed before, and they happened
+ # to use an email that's somewhat similar to their phab username.
+ email=$(git log -1 --author "$(echo $addr | tr _ .)" --pretty="%aN <%aE>")
+ if [ -n "$email" ]; then
+ echo "$email"
+ return
+ fi
+
+ # Choice 3: We know this user. They've committed before, and they happened
+ # to use the same name, unless the name has the word 'user' in it. This
+ # might not be a good idea, since names can be somewhat common (there
+ # are two Andrew Turners that have contributed to FreeBSD, for example).
+ if (echo "${name}" | grep -w "[Uu]ser" -q); then
+ else
+ email=$(git log -1 --author "${name}" --pretty="%aN <%aE>")
+ if [ -n "$email" ]; then
+ echo "$email"
+ return
+ fi
+ fi
+
+ # Choice 4: Wing it as best we can. In this scenario, we replace the last _
+ # with a @, and call it the email address...
+ # Annoying fun fact: Phab replaces all non alpha-numerics with _, so we
+ # don't know if the prior _ are _ or + or any number of other characters.
+ # So this winging it isn't always our best hope, but will usually get
+ # things mostly enough right.
+ gitarc_default_email "${addr}" "${name}"
+}
+
+gitarc_commit()
+{
+ local diff reviewid review_data authorid user_data user_addr user_name author
+ local tmp def_email
+
+ diff=$1
+ reviewid=$(diff2phid "$diff")
+ review_data=$(echo '{
+ "constraints": {"phids": ["'"$reviewid"'"]}
+ }' |
+ arc_call_conduit -- differential.revision.search)
+ authorid=$(echo "$review_data" | jq -r '.response.data[].fields.authorPHID' )
+ user_data=$(echo '{
+ "constraints": {"phids": ["'"$authorid"'"]},
+ "attachments": {"revisions": true}
+ }' |
+ arc call-conduit -- user.search | grep -v ^Warning: |
+ jq -r '.response.data[].fields')
+ user_addr=$(echo "$user_data" | jq -r '.username')
+ user_name=$(echo "$user_data" | jq -r '.realName')
+ author=$(gitarc_find_author "$user_addr" "$user_name")
+
+ tmp=$(mktemp)
+ echo "$review_data" | jq -r '.response.data[].fields.title' > $tmp
+ echo >> $tmp
+ echo "$review_data" | jq -r '.response.data[].fields.summary' >> $tmp
+ echo >> $tmp
+ # XXX this leaves an extra newline in some cases.
+ reviewers=$(diff2reviewers "$diff" | sed '/^$/d' | paste -sd ',' - | sed 's/,/, /g')
+ if [ -n "$reviewers" ]; then
+ printf "Reviewed by:\t%s\n" "${reviewers}" >> "$tmp"
+ fi
+ printf "Differential Revision:\thttps://reviews.freebsd.org/%s\n" "${diff}" >> "$tmp"
+ git commit --author "${author}" --file "$tmp"
+ rm "$tmp"
+
+ # When Phabricator creates accounts, it does so by replacing all special
+ # characters with _, which is many-to-1, which cannot be undone. This is
+ # rare enough, though that we just warn about the condition for manual
+ # intervention. We try to make our best guess, but for first time submitters
+ # there's no data to correlate against. Eg, we don't know if a_b_c.com is
+ # a_b@c.com or a+b@c.com.
+ def_email=$(gitarc_default_email "${user_addr}" "${user_name}")
+ if [ "${author}" = "${def_email}" ]; then
+ case "${author}" in
+ *_*)
+ warn "The guessed '${author}' has a _ in it, so might be wrong, double check."
+ ;;
+ esac
+ fi
+}
+
gitarc__patch()
{
- local rev
+ local rev commit
if [ $# -eq 0 ]; then
err_usage
fi
+ commit=false
+ while getopts c o; do
+ case "$o" in
+ c)
+ commit=true
+ ;;
+ *)
+ err_usage
+ ;;
+ esac
+ done
+ shift $((OPTIND-1))
+
for rev in "$@"; do
arc patch --skip-dependencies --nocommit --nobranch --force "$rev"
echo "Applying ${rev}..."
[ $? -eq 0 ] || break
+ if $commit; then
+ gitarc_commit $rev
+ fi
done
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Feb 11, 11:34 PM (6 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16603049
Default Alt Text
D39992.id121636.diff (5 KB)
Attached To
Mode
D39992: git-arc: Add -c flag to patch to commit the change
Attached
Detach File
Event Timeline
Log In to Comment