Merge remote-tracking branch 'origin/entomologist-data' into entomologist-data
This commit is contained in:
commit
baa7cdd7e9
25 changed files with 141 additions and 3 deletions
1
093e87e8049b93bfa2d8fcd544cae75f/assignee
Normal file
1
093e87e8049b93bfa2d8fcd544cae75f/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
|
|
@ -3,4 +3,5 @@ add optional 'assignee' to issue
|
||||||
This is probably just another free-form text string for now, maybe
|
This is probably just another free-form text string for now, maybe
|
||||||
something fancier in the future.
|
something fancier in the future.
|
||||||
|
|
||||||
As part of this, teach `ent list FILTER` to filter by assignee.
|
NOTE: Teaching `ent list FILTER` to filter by assignee is a separate
|
||||||
|
issue.
|
||||||
|
|
|
||||||
1
75cefad80aacbf23fc7b9c24a75aa236/assignee
Normal file
1
75cefad80aacbf23fc7b9c24a75aa236/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
|
|
@ -1 +1 @@
|
||||||
inprogress
|
done
|
||||||
1
793bda8b9726b0336d97e856895907f8/assignee
Normal file
1
793bda8b9726b0336d97e856895907f8/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
1
793bda8b9726b0336d97e856895907f8/state
Normal file
1
793bda8b9726b0336d97e856895907f8/state
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
done
|
||||||
13
7d2d236668872cf11f167ac0462f8751/description
Normal file
13
7d2d236668872cf11f167ac0462f8751/description
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
add `ent tag ISSUE_ID TAG`
|
||||||
|
|
||||||
|
Tags are short text strings without white space.
|
||||||
|
|
||||||
|
The Issue directory will gain a file named `tags`, containing the sorted
|
||||||
|
list of tags.
|
||||||
|
|
||||||
|
The `ent list` output will add a bit to the end of each issue displayed,
|
||||||
|
something like "[tag1, tag2]", or nothing if the issue has no tags
|
||||||
|
(like how we don't show assignee if there is none).
|
||||||
|
|
||||||
|
As part of this issue, the `ent list FILTER` will gain a new filter
|
||||||
|
chunk type like "tags=v2.31,ux-papercut".
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
I think this will be easy. We'll teach `ent edit ID` to search not only
|
||||||
|
issue IDs but also comment IDs, then reuse the existing edit code.
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
This is a duplicate of issue e089400e8a9e11fe9bf10d50b2f889d7
|
||||||
1
9e69a30ad6965d7488514584c97ac63c/assignee
Normal file
1
9e69a30ad6965d7488514584c97ac63c/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
1
9e69a30ad6965d7488514584c97ac63c/description
Normal file
1
9e69a30ad6965d7488514584c97ac63c/description
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
teach `ent list FILTER` to filter by assignee
|
||||||
1
9e69a30ad6965d7488514584c97ac63c/state
Normal file
1
9e69a30ad6965d7488514584c97ac63c/state
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
done
|
||||||
1
a26da230276d317e85f9fcca41c19d2e/assignee
Normal file
1
a26da230276d317e85f9fcca41c19d2e/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
1
a26da230276d317e85f9fcca41c19d2e/state
Normal file
1
a26da230276d317e85f9fcca41c19d2e/state
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
inprogress
|
||||||
7
a5ac277614ea4d13f78031abb25ea7d6/description
Normal file
7
a5ac277614ea4d13f78031abb25ea7d6/description
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
`ent new` and `ent comment`: detect empty issue descriptions & comments
|
||||||
|
|
||||||
|
If the user changes their mind and saves an empty file, don't make a
|
||||||
|
new empty comment.
|
||||||
|
|
||||||
|
For an embarrassing example, see comment 9e81dce91164a3ee26c3214ee2d9d809
|
||||||
|
on issue 75cefad80aacbf23fc7b9c24a75aa236.
|
||||||
7
ae56208b6db64ccd9da31ce2bb1aad64/description
Normal file
7
ae56208b6db64ccd9da31ce2bb1aad64/description
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
`ent sync`, ^C, now there's a stray worktree
|
||||||
|
|
||||||
|
The worktree has the `entomologist-data` branch checked out in it,
|
||||||
|
so ent won't make another.
|
||||||
|
|
||||||
|
Probably want a crash handler in `ent` to clean up any worktree we
|
||||||
|
have open.
|
||||||
1
af53c561b36e9b2709b939f81daee534/assignee
Normal file
1
af53c561b36e9b2709b939f81daee534/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
seb
|
||||||
1
af53c561b36e9b2709b939f81daee534/description
Normal file
1
af53c561b36e9b2709b939f81daee534/description
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
use git author info to attribute issues and comments to people
|
||||||
1
af53c561b36e9b2709b939f81daee534/state
Normal file
1
af53c561b36e9b2709b939f81daee534/state
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
done
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
# `ent list FILTER` filter format
|
||||||
|
|
||||||
|
I'm not sure about the filter format, but here are some notes...
|
||||||
|
|
||||||
|
There are (as of df7b5c6aa4a00dfca66dc802f1e813f23f27a5b9) two independent
|
||||||
|
filters: "state" and "assignee". The "state" filter defaults to
|
||||||
|
including issues whose state is InProgress, Blocked, Backlog, or New.
|
||||||
|
The "assignee" filter defaults to including all issues, assigned or not.
|
||||||
|
|
||||||
|
The two filters can be independently overridden by the `ent list
|
||||||
|
FILTER` command. FILTER is a string containing "chunks" separated by
|
||||||
|
":", like the PATH environment variable. Each chunk is of the form
|
||||||
|
"name=value[,value...]". "name" can currently be either "state" or
|
||||||
|
"assignee", and we can add more in the future (e.g "tag" or "ctime").
|
||||||
|
|
||||||
|
The "value" arguments to the "state" filter must be one of the valid
|
||||||
|
states, or it's a parse error.
|
||||||
|
|
||||||
|
The "value" arguments to the "assignee" filter are used to
|
||||||
|
string-compare against the issues "assignee" field, exact matches are
|
||||||
|
accepted and everything else is rejected. A special assignee filter of
|
||||||
|
the empty string matches issues that don't have an assignee.
|
||||||
|
|
||||||
|
Some examples:
|
||||||
|
|
||||||
|
* `ent list` shows issues in the states listed above, and don't filter
|
||||||
|
based on assignee at all.
|
||||||
|
|
||||||
|
* `ent list assignee=seb` shows issues in the states listed above,
|
||||||
|
but only if the assignee is "seb".
|
||||||
|
|
||||||
|
* `ent list assignee=seb,` shows issues in the states listed above,
|
||||||
|
but only if the assignee is "seb" or if there is no assignee.
|
||||||
|
|
||||||
|
* `ent list state=done` shows all issues in the Done state.
|
||||||
|
|
||||||
|
* `ent list state=inprogress:assignee=seb` shows issues in the InProgress
|
||||||
|
state that are assigned to "seb".
|
||||||
20
bed47b2be016cc41eb43ef6d0acf1f8f/description
Normal file
20
bed47b2be016cc41eb43ef6d0acf1f8f/description
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
make issue assignment more flexible
|
||||||
|
|
||||||
|
I think there are two things i want that don't currently work:
|
||||||
|
* add some way to un-assign a person from an issue
|
||||||
|
* support multiple people assigned to the same issue
|
||||||
|
|
||||||
|
Maybe the `assignee` field of the Issue struct should be a Vec<String>
|
||||||
|
instead of String? And the `assignee` file of the issue directory should
|
||||||
|
be a list, one assignee per line?
|
||||||
|
|
||||||
|
Possible new CLI ui:
|
||||||
|
|
||||||
|
* `ent assign ISSUE PERSON[,PERSON...]` replaces the `assignee` list
|
||||||
|
with the new user-specified list.
|
||||||
|
* `ent assign ISSUE +PERSON` adds PERSON to the list
|
||||||
|
* `ent assign ISSUE -PERSON` removes the PERSON from the list
|
||||||
|
|
||||||
|
Also support removing the `assignee` file from the issue directory if the
|
||||||
|
list is empty. Or maybe allow the file to exist but with 0 bytes in it?
|
||||||
|
Probably either one is fine.
|
||||||
1
da435e5e298b28dc223f9dcfe62a9140/assignee
Normal file
1
da435e5e298b28dc223f9dcfe62a9140/assignee
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
lex
|
||||||
|
|
@ -1 +1 @@
|
||||||
inprogress
|
done
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
One possible way to determine how much of the UUID we need to keep
|
||||||
|
for uniqueness:
|
||||||
|
|
||||||
|
* Read the issue database into memory
|
||||||
|
|
||||||
|
* Build a tree of all the issue ids:
|
||||||
|
|
||||||
|
* Define a Node type for a tree datastructure as:
|
||||||
|
enum Node {
|
||||||
|
Empty,
|
||||||
|
IssueId(String),
|
||||||
|
SubNodes([&Node; 256]),
|
||||||
|
}
|
||||||
|
|
||||||
|
* Create an empty root node = Node::Empty
|
||||||
|
|
||||||
|
* For each issue:
|
||||||
|
issue_id_bytes = issue_id.iter()
|
||||||
|
|
||||||
|
issue_id_byte = issue_id_bytes.next()
|
||||||
|
current_node = root
|
||||||
|
|
||||||
|
while current_node == SubNodes:
|
||||||
|
current_node = current_node[issue_id_byte]
|
||||||
|
issue_id_byte = issue_id_bytes.next()
|
||||||
|
|
||||||
|
if current_node == Empty:
|
||||||
|
current_node = Node::IssueId(issue_id)
|
||||||
|
else: # we know current_node == IssueId(original_issue_id)
|
||||||
|
replace current_node with a SubNodes initialized to [Node::Empty; 256]
|
||||||
|
current_node[original_issue_id[depth]] = Node::IssueId(original_issue_id)
|
||||||
|
recurse trying again to insert issue_id
|
||||||
|
|
||||||
|
* Walk the entire tree, keeping track of the depth of each IssueId node (ie the number of SubNodes nodes above it)
|
||||||
|
|
||||||
|
* The largest depth is the number of bytes of the issue ids neede to ensure uniqueness
|
||||||
Loading…
Add table
Add a link
Reference in a new issue