summaryrefslogtreecommitdiff
path: root/doc/todo/unused_by_refspec.mdwn
blob: ea84599bb80af2d334727eed3dccaac3137f49ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Currently `git annex unused` assumes that all branches (including remote
tracking branches) and tags are "used" and finds only objects not used by
any of those refs.

That's a reasonable default, but in some cases, we don't care about
specific refs. Perhaps we don't consider remote tracking branches
important. Or perhaps we only want objects in HEAD to be considered used.

This could be handled by adding an option to specify a refspec when running
git-annex unused. Only matching refs would be checked. It's probably worth
making this be both a command-line option --used-refspec, as well as a
annex.used-refspec config setting.

git's refspec format is not quite right (since it specifies a local side
and a remote side for push/pull). But, it can be used as a point of
departure. Let's allow wildcards as it does, and use leading '+' to add a
ref, and '-' to remove. Let the user specify multiple such expressions,
separated by ':'.

	+refs/heads/*:+HEAD^:+refs/tags/*:-refs/tags/old-tag

This is processed by starting with an empty set of refs, and walking the
refspec in order. 

* Each + is matched against all known refs (from `git show-ref`), and adds
  everything it matches to the set. If the + does not contain a wildcard,
  it is literally added to the set, rather than looking in the known refs.
  This allows "+refs/heads/*" to match all heads, and "+HEAD"
  to match HEAD, or even "+sha" to match a given SHA, or "+HEAD^" to match
  the previous head.
* Each - is matched against the contents of the set, and removes everything
  it matches, using a lexographic matching with wildcards (not looking at
  the SHAs that the refs point to, so -refs/heads/master does not remove
  +HEAD).

Hmm, unused currently does a separate pass to find files used in the work
tree. I think it's best to keep that as-is.

--[[Joey]]

> [[done]] --[[Joey]]