This implements `tg patch -i` and `tg patch -w` to see current patch as
generated against not-yet-committed index and worktree.
NOTE: unfortunately `git cat-file blob <file>` does not provide an option
to cat file from worktree (only from an object or from index), so I had to
unroll my own `cat file topic:file` with special support for '(i)' and
'(w)' topics.
Signed-off-by: Kirill Smelkov <redacted>
---
README | 5 +++--
contrib/tg-completion.bash | 6 ++++++
tg-patch.sh | 31 +++++++++++++++++++++++++------
tg.sh | 21 +++++++++++++++++++++
4 files changed, 55 insertions(+), 8 deletions(-)
@@ -284,8 +284,9 @@ tg patch tg patch will be able to automatically send the patches by mail or save them to files. (TODO)- TODO: tg patch -i to base at index instead of branch,- -w for working tree+ Options:+ -i base patch generation on index instead of branch+ -w base patch generation on working tree instead of branch tg mail ~~~~~~~
@@ -5,14 +5,25 @@name=+topic=+diff_opts=+diff_committed_only=yes# will be unset for index/worktree+## Parse optionswhile[-n"$1"];doarg="$1";shiftcase"$arg"in+-i)+topic='(i)'+diff_opts="$diff_opts --cached";;+diff_committed_only=;+-w)+topic='(w)'+diff_committed_only=;;-*)-echo"Usage: tg [...] patch [NAME]">&2+echo"Usage: tg [...] patch [-i | -w] [NAME]">&2exit1;;*)[-z"$name"]||die"name already specified ($name)"
@@ -20,31 +31,39 @@ while [ -n "$1" ]; doesacdone++[-n"$name"-a-z"$diff_committed_only"]&&+die"-i/-w are mutually exclusive with NAME"+[-n"$name"]||name="$(gitsymbolic-refHEAD|sed's#^refs/\(heads\|top-bases\)/##')"base_rev="$(gitrev-parse--short--verify"refs/top-bases/$name"2>/dev/null)"||die"not a TopGit-controlled branch"+# if not index/worktree, topic is current branch+[-z"$topic"]&&topic="$name"++ setup_pager-gitcat-fileblob"$name:.topmsg"+cat_file"$topic:.topmsg"echo-[-n"$(gitgrep'^[-]--'"$name"--".topmsg")"]||echo'---'+[-n"$(gitgrep$diff_opts'^[-]--'${diff_committed_only:+"$name"}--".topmsg")"]||echo'---'# Evil obnoxious hack to work around the lack of git diff --excludegit_is_stupid="$(mktemp-ttg-patch-changes.XXXXXX)"-gitdiff-tree--name-only"$base_rev""$name"|+gitdiff--name-only$diff_opts"$base_rev"${diff_committed_only:+"$name"}--|fgrep-vx".topdeps"|fgrep-vx".topmsg">"$git_is_stupid"||:# fgrep likes to fail randomly?if[-s"$git_is_stupid"];then-cat"$git_is_stupid"|xargsgitdiff--patch-with-stat"$base_rev""$name"--+cat"$git_is_stupid"|xargsgitdiff--patch-with-stat$diff_opts"$base_rev"${diff_committed_only:+"$name"}--elseecho"No changes."fi rm"$git_is_stupid"echo'-- '-echo"tg: ($base_rev..) $name (depends on: $(gitcat-fileblob"$name:.topdeps"|paste-s-d' '))"+echo"tg: ($base_rev..) $name (depends on: $(cat_file"$topic:.topdeps"|paste-s-d' '))" branch_contains"$name""$base_rev"||echo"tg: The patch is out-of-date wrt. the base! Run \`$tg update\`."
@@ -17,6 +17,27 @@ die()exit1}+# cat_file "topic:file"+# Like `git cat-file blob $1`, but topics (i) and (w) means index and worktree+cat_file()+{+arg="$1"+case"$arg"in+'(w):'*)+arg=$(echo"$arg"|tail--bytes=+5)+cat"$arg"+return+;;+'(i):'*)+# ':file' means cat from index+arg=$(echo"$arg"|tail--bytes=+5)+gitcat-fileblob":$arg"+;;+*)+gitcat-fileblob"$arg"+esac+}+# setup_hook NAME setup_hook(){
--
tg: (a3a5be1..) t/tg-patch-worktree (depends on: t/tg-patch-setup-pager)
From: martin f krafft <hidden> Date: 2016-06-15 22:45:53
also sprach Kirill Smelkov [off-list ref] [2009.01.09.0722 +1300]:
This implements `tg patch -i` and `tg patch -w` to see current
patch as generated against not-yet-committed index and worktree.
I think at this early stage, it would make sense to use long options
and not reserve short options yet. Unless Petr disagrees, I'd kindly
ask you to use long options instead. Once TopGit has been around for
a while, we can provide short options for the most important long
options.
This is possibly too conservative, but I've been bitten by lack of
new letters before because I've used them all up for options that
later turned out not to be needed.
I have not yet had the time to actually look at the patch.
--
martin | http://madduck.net/ | http://two.sentenc.es/
"when zarathustra was alone... he said to his heart: 'could it be
possible! this old saint in the forest hath not yet heard of it, that
god is dead!'"
- friedrich nietzsche
spamtraps: madduck.bogus@madduck.net
On Fri, Jan 09, 2009 at 08:53:56AM +1300, martin f krafft wrote:
also sprach Kirill Smelkov [off-list ref] [2009.01.09.0722 +1300]:
quoted
This implements `tg patch -i` and `tg patch -w` to see current
patch as generated against not-yet-committed index and worktree.
I think at this early stage, it would make sense to use long options
and not reserve short options yet. Unless Petr disagrees, I'd kindly
ask you to use long options instead. Once TopGit has been around for
a while, we can provide short options for the most important long
options.
This is possibly too conservative, but I've been bitten by lack of
new letters before because I've used them all up for options that
later turned out not to be needed.
I agree, but when I found myself needing something like
`tg patch --index`, I've spot this in README:
--- a/README
+++ b/README
@@ -284,8 +284,9 @@ tg patch
tg patch will be able to automatically send the patches by mail
or save them to files. (TODO)
- TODO: tg patch -i to base at index instead of branch,
- -w for working tree
So I concluded -i/-w was planned from the beginning.
I myself would call these options --index and --work or something
like that, but I'll be ok with any option.
Thanks,
Kirill
So here is corrected patch:
From: Kirill Smelkov <redacted>
To: Petr Baudis <redacted>
Cc: martin f krafft <redacted>
Cc: Git Mailing List <redacted>
Subject: [PATCH (topgit)] tg-patch: add support for generating patches against worktree and index
This implements `tg patch -i` and `tg patch -w` to see current patch as
generated against not-yet-committed index and worktree.
NOTE: unfortunately `git cat-file blob <file>` does not provide an option
to cat file from worktree (only from an object or from index), so I had to
unroll my own `cat file topic:file` with special support for '(i)' and
'(w)' topics.
Signed-off-by: Kirill Smelkov <redacted>
---
README | 5 +++--
contrib/tg-completion.bash | 6 ++++++
tg-patch.sh | 31 +++++++++++++++++++++++++------
tg.sh | 21 +++++++++++++++++++++
4 files changed, 55 insertions(+), 8 deletions(-)
@@ -284,8 +284,9 @@ tg patch tg patch will be able to automatically send the patches by mail or save them to files. (TODO)- TODO: tg patch -i to base at index instead of branch,- -w for working tree+ Options:+ -i base patch generation on index instead of branch+ -w base patch generation on working tree instead of branch tg mail ~~~~~~~
@@ -5,14 +5,25 @@name=+topic=+diff_opts=+diff_committed_only=yes# will be unset for index/worktree+## Parse optionswhile[-n"$1"];doarg="$1";shiftcase"$arg"in+-i)+topic='(i)'+diff_opts="$diff_opts --cached";+diff_committed_only=;;+-w)+topic='(w)'+diff_committed_only=;;-*)-echo"Usage: tg [...] patch [NAME]">&2+echo"Usage: tg [...] patch [-i | -w] [NAME]">&2exit1;;*)[-z"$name"]||die"name already specified ($name)"
@@ -20,31 +31,39 @@ while [ -n "$1" ]; doesacdone++[-n"$name"-a-z"$diff_committed_only"]&&+die"-i/-w are mutually exclusive with NAME"+[-n"$name"]||name="$(gitsymbolic-refHEAD|sed's#^refs/\(heads\|top-bases\)/##')"base_rev="$(gitrev-parse--short--verify"refs/top-bases/$name"2>/dev/null)"||die"not a TopGit-controlled branch"+# if not index/worktree, topic is current branch+[-z"$topic"]&&topic="$name"++ setup_pager-gitcat-fileblob"$name:.topmsg"+cat_file"$topic:.topmsg"echo-[-n"$(gitgrep'^[-]--'"$name"--".topmsg")"]||echo'---'+[-n"$(gitgrep$diff_opts'^[-]--'${diff_committed_only:+"$name"}--".topmsg")"]||echo'---'# Evil obnoxious hack to work around the lack of git diff --excludegit_is_stupid="$(mktemp-ttg-patch-changes.XXXXXX)"-gitdiff-tree--name-only"$base_rev""$name"|+gitdiff--name-only$diff_opts"$base_rev"${diff_committed_only:+"$name"}--|fgrep-vx".topdeps"|fgrep-vx".topmsg">"$git_is_stupid"||:# fgrep likes to fail randomly?if[-s"$git_is_stupid"];then-cat"$git_is_stupid"|xargsgitdiff--patch-with-stat"$base_rev""$name"--+cat"$git_is_stupid"|xargsgitdiff--patch-with-stat$diff_opts"$base_rev"${diff_committed_only:+"$name"}--elseecho"No changes."fi rm"$git_is_stupid"echo'-- '-echo"tg: ($base_rev..) $name (depends on: $(gitcat-fileblob"$name:.topdeps"|paste-s-d' '))"+echo"tg: ($base_rev..) $name (depends on: $(cat_file"$topic:.topdeps"|paste-s-d' '))" branch_contains"$name""$base_rev"||echo"tg: The patch is out-of-date wrt. the base! Run \`$tg update\`."
@@ -17,6 +17,27 @@ die()exit1}+# cat_file "topic:file"+# Like `git cat-file blob $1`, but topics '(i)' and '(w)' means index and worktree+cat_file()+{+arg="$1"+case"$arg"in+'(w):'*)+arg=$(echo"$arg"|tail--bytes=+5)+cat"$arg"+return+;;+'(i):'*)+# ':file' means cat from index+arg=$(echo"$arg"|tail--bytes=+5)+gitcat-fileblob":$arg"+;;+*)+gitcat-fileblob"$arg"+esac+}+# setup_hook NAME setup_hook(){
--
tg: (a3a5be1..) t/tg-patch-worktree (depends on: t/tg-patch-setup-pager)
So here is corrected patch:
From: Kirill Smelkov <redacted>
To: Petr Baudis <redacted>
Cc: martin f krafft <redacted>
Cc: Git Mailing List <redacted>
Subject: [PATCH (topgit)] tg-patch: add support for generating patches against worktree and index
This implements `tg patch -i` and `tg patch -w` to see current patch as
generated against not-yet-committed index and worktree.
NOTE: unfortunately `git cat-file blob <file>` does not provide an option
to cat file from worktree (only from an object or from index), so I had to
unroll my own `cat file topic:file` with special support for '(i)' and
'(w)' topics.
Signed-off-by: Kirill Smelkov <redacted>
[...]
Petr, Martin,
What's the state of this patch?
I don't understand why this gets ignored. Maybe I do something wrong?
...
Thanks,
Kirill
From: martin f krafft <hidden> Date: 2016-06-15 22:45:59
also sprach Kirill Smelkov [off-list ref] [2009.01.19.0206 +1100]:
I don't understand why this gets ignored. Maybe I do something wrong?
I am not ignoring it, I am just currently flooded and travelling.
I don't see any obvious problems with your patch, but I do not have
the time to test it right now. I will do my best to do another
release when I return from Tasmania, hopefully on the plane trip
home. Maybe Petr can get around to it before I do.
Cheers, and sorry,
--
martin | http://madduck.net/ | http://two.sentenc.es/
if you find a spelling mistake in the above, you get to keep it.
spamtraps: madduck.bogus@madduck.net
On Tue, Jan 20, 2009 at 11:21:03AM +1100, martin f krafft wrote:
also sprach Kirill Smelkov [off-list ref] [2009.01.19.0206 +1100]:
quoted
I don't understand why this gets ignored. Maybe I do something wrong?
I am not ignoring it, I am just currently flooded and travelling.
I don't see any obvious problems with your patch, but I do not have
the time to test it right now. I will do my best to do another
release when I return from Tasmania, hopefully on the plane trip
home. Maybe Petr can get around to it before I do.
Cheers, and sorry,
No problem and take your time.
It was just me having no idea about what's going on.
Happy travelling,
Kirill
From: martin f krafft <hidden> Date: 2016-06-15 22:45:59
also sprach Kirill Smelkov [off-list ref] [2009.01.21.0456 +1100]:
No problem and take your time.
It was just me having no idea about what's going on.
I am a little confused about the patches, and git-am does not seem
to be able to apply two patches from the same email. I use Maildir,
so I am passing the single message with multiple patches to git-am,
and it applies all changes into one single commit.
Anyway, do you have a repo which I can cherry-pick from?
--
martin | http://madduck.net/ | http://two.sentenc.es/
"out of the crooked timber of humanity,
no straight thing was ever made."
-- imanuel kant
spamtraps: madduck.bogus@madduck.net
On Wed, Jan 21, 2009 at 02:20:52PM +1100, martin f krafft wrote:
also sprach Kirill Smelkov [off-list ref] [2009.01.21.0456 +1100]:
quoted
No problem and take your time.
It was just me having no idea about what's going on.
I am a little confused about the patches, and git-am does not seem
to be able to apply two patches from the same email. I use Maildir,
so I am passing the single message with multiple patches to git-am,
and it applies all changes into one single commit.
I see.
It seems I need to study how to prepare patches with patchy comments, or
get my hands dirty with `git am` :)
Anyway, do you have a repo which I can cherry-pick from?
From: martin f krafft <hidden> Date: 2016-06-15 22:46:00
also sprach Kirill Smelkov [off-list ref] [2009.01.22.0726 +1100]:
It seems I need to study how to prepare patches with patchy
comments, or get my hands dirty with `git am` :)
I believe git-send-email --editor can be used to create a lead-in
mail to describe what follows, and send patches in separate messages
in reply to that lead-in.
--
martin | http://madduck.net/ | http://two.sentenc.es/
"welcome to american airlines, sir. here's your avocado - remember to
keep it turned on and with you at all times. please turn your luggage
over to the armadillos for rootling."
-- http://azure.humbug.org.au/~aj/armadillos.txt
spamtraps: madduck.bogus@madduck.net