Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add spec for #1620 #2650

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open

Conversation

SirusCodes
Copy link

@SirusCodes SirusCodes commented Oct 29, 2022


Create a spec as requested by @denelon at #1620 (comment)

Microsoft Reviewers: Open in CodeFlow

@SirusCodes
Copy link
Author

@microsoft-github-policy-service agree

@SirusCodes SirusCodes marked this pull request as ready for review October 31, 2022 19:19
@SirusCodes SirusCodes requested a review from a team as a code owner October 31, 2022 19:19
@SirusCodes
Copy link
Author

@denelon can you review it?

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

My "meta" feedback is this seems to work well for installing a single package.

We shouldn't have ambiguity with import since the source and the ID need to be specified in the packages.json file.

I wonder if we should have a "default" behavior and settings to change the default behavior. It may not be necessary, but this is a departure from the current behavior.

I'm also not sure what this is going to "sound" like with narrator running.

Our telemetry needs to be reasoned about as well. If a user runs winget install <something> and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

@yao-msft what are your thoughts here?

@yao-msft
Copy link
Contributor

yao-msft commented Oct 31, 2022

This package selection mechanism could be extended to winget upgrade <single package>, winget uninstall <single package> and winget show <single package> as well, since these use the same worflow to pick a package internally.

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change. Or we should announce this "breaking" default behavior well ahead before we make this the default behavior. In the early winget design principal, winget tries not to prompt for user input unless it has to(i.e. accepting agreements, missing arguments, etc), and the prompt can be disabled in many ways.

Regarding installing multiple packages in one command, it requires further thinking and framework changes are likely required to support this. Command line syntax may also need to be revisited.

@denelon
Copy link
Contributor

denelon commented Oct 31, 2022

@yao-msft
So maybe something like adding "--prompt" could prompt if the results are ambiguous, and a setting could be added to make the setting default and "--no-prompt" could override the setting via the CLI?

@yao-msft
Copy link
Contributor

@yao-msft So maybe something like adding "--prompt" could prompt if the results are ambiguous, and a setting could be added to make the setting default and "--no-prompt" could override the setting via the CLI?

We already have a cli arg and user setting both called "DisableInteractivity" to indicate "no prompt", it's opted in for com callers(can not be overriden) but not from cli. So I guess the current default in cli is already "allow prompt". But currently only very few packages will trigger a prompt. With this feature, we'll see prompts a lot more, so I'm wondering if we should have a specific opt in for this(from settings), we may change the default behavior in future. In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems. I think a setting for opt in is enough. And I'm open to other suggestions as well.

@SirusCodes
Copy link
Author

This package selection mechanism could be extended to winget upgrade <single package>, winget uninstall <single package> and winget show <single package> as well, since these use the same worflow to pick a package internally.

Yes this can/should be extended to those as well. Will make that change in the spec.

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change. Or we should announce this "breaking" default behavior well ahead before we make this the default behavior. In the early winget design principal, winget tries not to prompt for user input unless it has to(i.e. accepting agreements, missing arguments, etc), and the prompt can be disabled in many ways.

Can you please elaborate on this more? As I feel it will only come in if there are multiple matches and we get a table of packages in current implementation.
Everyone would write a script using Id's which are a unique to each package and if they get the selector they will get the current table in current implementation.
Only difference would be that in current implementation the command would return and not wait for an user input.

Regarding installing multiple packages in one command, it requires further thinking and framework changes are likely required to support this. Command line syntax may also need to be revisited.

Yeah, that is not the goal of this spec. I added that because if in future we plan to add that this is how selector should work.

@SirusCodes
Copy link
Author

With this feature, we'll see prompts a lot more

How? This will only come into picture if there are multiple matches in current implementation.

For example.

winget install Powershell

It currently gives you 2 packages and after this it will also give you 2 packages just will a easy selector.

@SirusCodes
Copy link
Author

I'm also not sure what this is going to "sound" like with narrator running.

Yeah I'm also not sure about that but if it reads it line by line then there shouldn't be a big problem.
Maybe I can try implementing a dummy one and see.

Our telemetry needs to be reasoned about as well. If a user runs winget install <something> and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

I haven't thought about this. Can you help me out with it?

@ghost ghost added the Needs-Author-Feedback Issue needs attention from issue or PR author label Nov 1, 2022
@Trenly
Copy link
Contributor

Trenly commented Nov 1, 2022

I wonder if we should have a "default" behavior and settings to change the default behavior. It may not be necessary, but this is a departure from the current behavior.

I think this is a necessity, especially for this feature. As was mentioned in the original issue and I touched upon in my review, there are users who will not want this feature at all - even outside of a scripting perspective. I would be a strong advocate for including user settings.

Our telemetry needs to be reasoned about as well. If a user runs winget install and we're not able to narrow it down to a single package, I don't want to have some "false" increased concept of "success".

I think this is as "simple" as adding a context flag that gets set whenever the interactive selector gets called, and sending that flag along with the telemetry. I would still count it as a success if the user was able to manually disambiguate, but I can understand if the internal needs differ here.

This package selection mechanism could be extended to winget upgrade , winget uninstall and winget show as well, since these use the same workflow to pick a package internally.

I think implementing this for upgrade would conflict with #2627. It may be a good feature in the meantime though. I agree with adding it for uninstall and show.

With this feature, we'll see prompts a lot more, so I'm wondering if we should have a specific opt in for this(from settings), we may change the default behavior in future. In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems. I think a setting for opt in is enough. And I'm open to other suggestions as well.

I go both ways on this. On one hand you have people like me who are technically inclined that would prefer to see and work with CLI output directly rather than have any form of interactivity in a CLI application, except that which is strictly necessary. On the other hand you have people who are using winget to install their favorite application and want it to be as quick and seamless as possible, and having interactivity would help. I think opt-out is easiest to implement from the DisableInteractivity perspective, and keeps the same current default behavior as other interactivity, but I prefer the original design principal of not asking for input unless we have to. I say that opt-in would be my final preference. (Apologies for long section, had to write my thoughts down for me to understand them myself)

Regarding default behavior, I think it'd be better to make this one opt-in from a specific argument (or settings?) since most automated systems, script writers will not be compatible with this change

I agree. Not only because of the points mentioned above, but I know that some scripts like marinet101/WingetUI actually use the table output and parse the text. Adding in an additional column here or making it so that the feature is opt-out would be a breaking change for them.

Everyone would write a script using Id's which are a unique to each package and if they get the selector they will get the current table in current implementation.

Id's aren't always guaranteed to be unique to a package. The item which is guaranteed to be unique is the Source-ID pair. It is entirely possible that two sources have the same identifier for different packages.

In another thought, if existing scripts work, they should already be able to point to a specific package, so it might not be that "breaking" for existing scripts and automated systems.

The more I think about this, I believe that the dynamic nature of sources would make this a breaking change. It is entirely possible that a script which is working today could be broken tomorrow by someone adding a new package to the repository, assuming the script was pointing at a volatile field like a package name; Or even in cases where a sub-package is added and there is potential for a moniker conflict that we aren't aware of. I would suspect that a sysadmin would rather have 1 package that failed to install with a very clear log about why as opposed to coming back several hours later just to find that the script hung because they weren't aware of the --disable-interactivity flag, and thought there would be no issues since the script was working fine before.

@ghost ghost removed the Needs-Author-Feedback Issue needs attention from issue or PR author label Nov 2, 2022
@denelon
Copy link
Contributor

denelon commented Nov 3, 2022

I think the default behavior should not change. This would certainly be breaking. I would expect to have a setting for "disambiguation". maybe "prompt" and "no-prompt". Then if one had the default they could override with "--prompt" or "--no-prompt".

The default setting would be "no-prompt"

Overriding the default setting would look like:

winget install PowerToys --prompt

Changing the default setting would look like:

"packageDisambiguation": {"prompt"}

Overriding the "prompt" setting would look like:

winget install PowerToys --no-prompt

@denelon
Copy link
Contributor

denelon commented Nov 3, 2022

Changing this behavior to be the default would require:

@SirusCodes
Copy link
Author

Hey @denelon, @yao-msft and @Trenly for your suggestions. I have updated the specs from suggestions you have given.

Tho there are a few things where I don't have much knowledge about and would be great if you can help me out in those parts.

I think implementing this for upgrade would conflict with #2627. It may be a good feature in the meantime though. I agree with adding it for uninstall and show.

@Trenly I'm not sure how this will conflict it


I think this is as "simple" as adding a context flag that gets set whenever the interactive selector gets called, and sending that flag along with the telemetry. I would still count it as a success if the user was able to manually disambiguate, but I can understand if the internal needs differ here.

I don't have any knowledge how telemetry and localization work and hence couldn't add anything about it in spec.

It would be great if you can point be where I can get to know about those.


I tried by printing an example on terminal with screen reader on. It read me the whole thing correctly but read No. (abbreviation of number) as No (as in answer to question).

Is there a way where we can get to know that the screen reader is on and print Number instead of No. or we should stick with Number?


I need your suggestions on how refine search should work. Should it refine results on the basis of exact match or match pattern?

I'm inclined towards matching patterns, but it may result into extra steps for users. Like if there are 2 packages with name Example and a package with name Example2 pattern matching will result in to retaining all three if user types Example to refine them. But at the same time, it will help users to type less to refine results.

Again, I would like it to be as pattern matching thing instead of exact match.


As previously discussed in review comment to have tab selection.

I'm not sure if it will be intuitive for users to use Tab to cycle through number. But if we are going with this, I want your opinion on if it should only cycle through number or package names as well? It doesn't make much sense to me to have both, cycling through numbers is more than enough in my opinion.

Also, if we are having Tab to cycle forward then we should have Tab + Shift to cycle backwards.

@Trenly
Copy link
Contributor

Trenly commented Nov 12, 2022

@Trenly I'm not sure how this will conflict it

If a user were to type winget upgrade Microsoft - there are multiple packages that match. The conflict would be whether the selection menu is shown, or if all packages matching Microsoft would be upgraded

Is there a way where we can get to know that the screen reader is on

I'm certain this is possible, it would just be a matter of how big the change would be to support this. It's probably better to use the full text Number all the time, or an alternate name like Index

I need your suggestions on how refine search should work. Should it refine results on the basis of exact match or match pattern?

I would suggest this be implemented as a temporary source. Essentially, the results in the table (including those that are truncated), would become a local source, and the default query behavior would be used. I believe this is a substring match, but I'd leave it up to whatever the current default search behavior is

I want your opinion on if it should only cycle through number or package names as well

My interpretation of denelon's comments is that tab completion would be most beneficial for cycling through Package Identifiers, and wouldn't be as helpful / necessary for numbers.

Also, if we are having Tab to cycle forward then we should have Tab + Shift to cycle backwards.

I agree. This is the current implementation of the tab completion used in the client, and the behavior should be carried forward.

@SirusCodes
Copy link
Author

If a user were to type winget upgrade Microsoft - there are multiple packages that match. The conflict would be whether the selection menu is shown, or if all packages matching Microsoft would be upgraded

So that should be added in potential issues section, right?

I'm certain this is possible, it would just be a matter of how big the change would be to support this. It's probably better to use the full text Number all the time, or an alternate name like Index

Number feels a better user-friendly word.

I would suggest this be implemented as a temporary source. Essentially, the results in the table (including those that are truncated), would become a local source, and the default query behavior would be used. I believe this is a substring match, but I'd leave it up to whatever the current default search behavior is

I feel default one is pattern matching by looking at the winget upgrade Microsoft example.

My interpretation of denelon's comments is that tab completion would be most beneficial for cycling through Package Identifiers, and wouldn't be as helpful / necessary for numbers.


Perfect, will make the necessary changes in next iteration.

use `-n` flag for result number
use `-m` flag for more results
tab completion
conflict in `upgrade` command
minor fixes
@SirusCodes SirusCodes requested review from Trenly and denelon and removed request for Trenly November 16, 2022 07:02
@SirusCodes SirusCodes removed the request for review from denelon November 28, 2022 17:17
@SirusCodes SirusCodes requested a review from Trenly November 28, 2022 17:17
@SirusCodes
Copy link
Author

@Trenly should we also rename of file to Query refinement.md?

@Trenly
Copy link
Contributor

Trenly commented Nov 29, 2022

@Trenly should we also rename of file to Query refinement.md?

Probably a good idea

@github-actions

This comment has been minimized.

@SirusCodes
Copy link
Author

@denelon, @yao-msft can you have a look?

@yao-msft
Copy link
Contributor

@denelon, @yao-msft can you have a look?

Hi @SirusCodes,

Thanks for your contribution and continued refinement of the spec. We are currently in the process of getting a release candidate of winget v1.4.0. We will get back to the spec when this feature work is scheduled.

Usually the spec will be checked in around the time implementation is done. And the spec might need to be modified and extended to match the actual implementation. I.e. features actually done, features moved to be considered in the future, a little description on the technical implementation like data schema, and expected behaviors and known issues, etc.

Thanks,
Yao

@bidaumm
Copy link

bidaumm commented Nov 1, 2023

It appears this has been stagnated since Dec '22
Is this still on the cards for future implementation?

@denelon
Copy link
Contributor

denelon commented Nov 1, 2023

Yes, we still want to offer an "interactive" mode for WinGet. We've been discussing several scenarios internally. This is one of the topics most likely to lead towards a WinGet 2.0.

Ideally, the default behavior for that version of WinGet will support better interactive experiences for users. We're also very aware of the desire to have non-interactive scripted experiences. We've been discussing the impact for automated scenarios and how we would have the client respond so scripted behaviors could more easily isolate the failures encountered by interruptions caused by interactive prompts expecting a user to respond.

If we offer the interactive experience as an option a user could "opt-in" we would need to figure out the best way to help them discover this new mode. We would certainly need settings and command-line arguments to toggle the behavior as a default mode as well as an override option.

@mominshaikhdevs
Copy link

what's the latest update on this?

## Future considerations
* Keyboard interactivity using <kbd>↑</kbd>, <kbd>↓</kbd>, and <kbd>Ener</kbd>

* Currently, Winget does not support installing multiple packages in a single command.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This has changed since the last iteration of the spec;

It should probably be updated so that each package which needs disambiguation goes through the disambiguation prompt at the start of the install flow.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Trenly are you talking about #4282 this? If yes, then what needs to be considered?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Trenly are you talking about #4282 this? If yes, then what needs to be considered?

No, I'm talking about #2861

@microsoft-github-policy-service microsoft-github-policy-service bot added the Needs-Author-Feedback Issue needs attention from issue or PR author label Jul 11, 2024
@microsoft-github-policy-service microsoft-github-policy-service bot added the No-Recent-Activity Issue has no recent activity label Jul 19, 2024
@SirusCodes
Copy link
Author

Hi all, I'm a bit busy. Will try to look at the PR this weekend.

@microsoft-github-policy-service microsoft-github-policy-service bot added Needs-Attention Issue needs attention from Microsoft and removed No-Recent-Activity Issue has no recent activity Needs-Author-Feedback Issue needs attention from issue or PR author labels Jul 19, 2024
@denelon denelon removed the Needs-Attention Issue needs attention from Microsoft label Jul 24, 2024
Copy link

@check-spelling-bot Report

🔴 Please review

See the 📂 files view or the 📜action log for details.

Unrecognized words (1399)
aconf
acroformtool
adb
adcl
addb
ADDBNDDIRE
ADDFILEINEXISTINGZIP
ADDINZIP
addler
addpoint
addsuffix
addthis
adelaide
adr
adrret
AFile
Ahvenlampi
AIAIAIAIAIAIA
alain
ALDAN
Alexey
allshared
allstatic
aloop
amigaos
amk
andb
andq
Andrzej
andthis
anisimkov
Aonix
aopt
appnote
arcname
ARFLAGS
armv
arrayasolutions
ARRR
ASFLAGS
Asmflags
ASMS
assmebler
Asumes
atari
atarist
Athlon
Attension
attrb
AUTOMAKE
autoselect
axp
BADZIPFILE
bak
Bakker
balign
bcc
bclose
beahvior
beenhere
Beihang
BERGEN
bestlen
bestlend
Betts
Beucler
BFINAL
bflush
bget
bhelp
BIGBUFSIZE
BINFILES
bitbuf
bitcnt
bitslong
bjoern
BKUPIFSNAME
Blammo
blbits
blcodes
blindex
bload
BNDDIR
bndsrc
bobdl
bonnefoy
bopen
bopt
Borca
borgsys
BORLAND
Borstel
Bosmans
Botlan
broonie
Brotli
Broukhis
bsfw
bskip
Bson
bstream
BTYPE
BUFREADCOMMENT
bugtraq
builddir
Burik
BYFOUR
bytary
BYTEBITS
bytecodes
bythirds
bziped
cachefly
Cadieux
carrefull
Caruana
CASESENSITIVITY
CASESENSITIVITYDEFAULT
CASESENSITIVITYDEFAULTVALUE
casestudies
castleproject
catchorg
ccflags
ccrc
CCSID
cdef
cdh
centraldir
centralheader
CENTRALHEADERMAGIC
cfa
CFBF
CFILES
cfz
chainlen
chainlenwmask
Charlap
checkfn
Chemeris
chng
chofz
CHOST
christop
Chupahin
Clarius
cld
cloexec
Clure
cmakedefine
CMakefile
cmakein
cmovng
cmovngl
cmovnl
cmpb
cmpq
cmpress
Cmps
cmpsb
cmpw
cmr
codecount
CODEOWNERS
codetype
Coghlan
coments
Compaq
comparisions
compearing
complen
completly
compr
compres
comprlen
Comression
comsize
concantenated
confh
copymeta
Cosmin
cosmint
couse
cov
Coverity
cpan
cparm
cpluplus
CPPFILES
CPPFLAGS
cpr
cpsize
cpuid
cranies
CRCERROR
CRCs
CREATEAFTER
Creech
CRTBNDDIR
CRTCMOD
CRTDLL
CRTDUPOBJ
CRTL
CRTLIB
CRTSRCPF
CRTSRVPGM
crypthead
crypting
csource
Ctrm
CURDIR
curfile
curlen
curmatch
curmatchd
currentfile
currenty
curretly
cvs
CXe
Cybozu
cygwin
cygz
Cyrix
Dalsnes
Darbois
DATAA
datablock
DATASPHERE
davispuh
dbakker
DBGVIEW
dbits
DCheck
dcode
ddr
decc
decomp
decompresed
decompressd
decompressors
defaut
defcpr
Defl
deflatestate
Dellaca
delphi
delte
depedent
depl
DEPSDIR
derivated
derrived
descrip
DESTDIR
destlen
devkitarm
devkitpro
devmajor
devminor
dext
dfa
dictid
Diekhans
diffs
DINFOZIP
disabiguation
distbits
distclean
distcnt
distcode
DISTEXT
DISTFILES
distfix
distlen
distribtution
dists
distsym
DJDIR
djgpp
dlname
DLocator
dlversion
dmask
Dmitriy
dnrsl
dnsrl
dnt
DOBIG
dodist
dolen
DOLIT
Donais
donwload
dosdate
dostime
dotzlib
Dpos
DRecord
DROPBITS
Dropbox
DTAFMT
dtree
DUMPDIR
DUPLICATEALIAS
dynamiclib
dynazip
DYNBNDDIR
easilty
ECCN
ECompression
edd
Eddelbuettel
EDecompression
EDTF
eduardo
eeee
eeeee
Eerror
eetbeetee
efah
eief
Elahi
Elemar
ello
emms
empted
emx
emximp
emxomfar
Enchance
endef
ENDHEADERMAGIC
ENDLOCHEADERMAGIC
ENDPGMEXP
endproc
endsource
endsubroutine
Ener
eob
eocd
eocdl
eocdr
eod
eprefix
eqs
equ
Eron
errclose
ERRORREXX
esac
eso
essex
etags
eurexchange
Evain
exabytes
examplesh
Exarevsky
exitval
EXLEN
exmples
explicitely
EXPOR
EXPORTVA
EXPREFIX
extproc
extr
extractdir
extrafield
extrainfo
extsize
exvlo
EZlib
fabricbot
facil
falloc
Fanslau
Fantoftvegen
fao
FAQs
farcall
farfree
farmalloc
Farshid
FBuffer
fcalloc
FCOMMENT
FDICT
Fearnley
Fedtke
feloop
FEXTRA
fffffef
fffffffffffffef
ffffffffh
FFFFh
fffh
FHCRC
Fiala
fifield
filebuffer
filedate
Fileflags
filefunc
filemane
filenameinzip
filestream
filetime
fillbuf
fillzffunc
filnam
fiow
fitblk
fixedtables
FIXLCODES
fjoin
FLa
Flate
FLEVEL
Flgvmat
Flinffas
Flinffasx
Flmatch
flushbuf
FLUSHCODE
fmemcmp
fmemcpy
fmemset
fnc
fnsize
follwed
formely
FORPARSING
fout
Frodo
FROMLIB
Frysinger
fseeki
FStrm
ftelli
ftestexist
FTEXT
ftm
FUJITSU
fxxxx
gcclib
gcda
gcno
GCopyright
gdal
Genererate
getheader
getjpi
getoct
getsyi
Gflags
Giersig
ginstall
globalcomment
gnatmake
gnatwcfilopru
gnatyabcefhiklmnoprst
GNUCC
gnupg
GNUTYPE
Gomes
gosub
gpflag
gpr
Greef
Groffen
gsi
Guevarra
Gulles
gunpipe
gvmat
gvmatch
gxs
gzappend
gzbody
GZBUFSIZE
gzcopy
gzeek
gzext
gzfilebuf
gzfilestream
gzflags
gzfread
gzfwrite
gzguts
gzhead
gzheader
gzifstream
gzindex
gzinit
gzio
gziped
gzipped
gzjoin
gzlib
gzlog
gzofstream
gzomanip
gzprint
gzs
gzscan
gztack
Haan
Hainley
Haksi
halloc
Haruhiko
havedict
hbuf
HCLEN
HDIST
hdone
headr
henrik
Herborth
hfree
Hildenborg
Hirschberg
hlibz
HLIT
hloop
hoehrmann
Holmgren
Homurlu
Horvath
hotmail
HPFS
huffman
huft
icbt
icc
iconr
idel
idl
IFCRYPTALLOWED
ifeq
ifneq
IFSDIR
IFSFILE
IIf
ijs
implib
improvment
INCDIR
INCDIRFIRST
INCLUDECRYPTINGCODE
includedir
incnt
incompartible
INDATABLOCK
indp
infback
infblock
infcodes
infcover
inffas
inffast
inffasx
inffix
infoserve
infozip
inftest
inftree
infun
infutil
Ingy
inhow
INITBITS
inmemory
inname
insertor
INTERIX
INTERNALERROR
interntal
interupted
invalidparameter
inzip
ioapi
iowin
irrez
isable
itu
izstream
jae
jbe
JELMER
jge
Jguer
jhainley
jnc
jne
jnz
jon
joran
Kazuho
kbd
kbytes
Kconform
kevin
keyshift
KFree
Kientzle
KJk
Kleinert
Klomp
Kohlhoff
KPIC
kreuzerkrieg
Krinke
Krzemienski
ksh
Kuchling
Kuno
Kupries
lastbit
lastblock
lasterr
lastest
lastoff
lastslash
lbase
lbits
lcc
lcode
lcompr
LDADD
ldconfig
ldef
ldi
ldinext
LDLIBS
LDSHARED
LDSHAREDLIBC
Lelewer
Lempel
lenb
lenbits
lencnt
lencode
LENEXT
lenfix
lenlen
lensym
Lepilleur
lext
lfh
LGCHUNK
LIBCMT
libdefs
libdest
LIBDIRS
libgz
LIBIFSNAME
LIBL
libminizip
LIBNDS
libopt
libpng
LIBRARYN
libzdll
libzip
libzshr
Lillge
limitd
Linhart
linkedlist
Linkflags
linkname
linkonly
linkto
LINX
LIres
listfiles
litcnt
litcode
litlen
litsym
Llopis
lmask
lng
lngfnc
lngpvt
lnk
LOADONCALL
LOCALETYPE
LOCALHEADER
LOCALHEADERMAGIC
localstatedir
locft
loctm
lodsd
lodsl
lodsw
logd
LOGID
Lohmann
Loitsch
Londer
LONGLINK
Looijaard
lopts
Lovset
lpdw
LPWORD
lseeki
LTLIBRARIES
ltree
lunpipe
lzw
MAKECRCH
makedepend
makedir
makefiles
makefixed
Makeit
makelcc
maketree
MAKEULONG
malbrech
mandoc
mapfile
markn
marknelson
Marot
masm
masmdl
masmx
matchname
mathias
mathod
MATSUURA
MAXCODES
MAXD
MAXDCODES
maxed
MAXFILENAME
MAXFILENAMEINZIP
MAXLCODES
MAXU
mcr
mdef
mdsos
metux
Micael
minigzipsh
miniunz
miniunzip
minizip
minzip
Mitsunari
mkasm
MKWERKS
mmap'ed
mmap'ing
MMD
mmk
mms
mmx
MNG
modft
modific
MODIFSNAME
module'mod
modulos
Moene
Mohanathas
Mokrejs
Monnerat
Moretti
mostlyclean
movd
movdqu
movsb
movsw
movzbl
movzwl
movzx
mozilla
MPROP
mrdone
mrloop
mrsloop
msc
MSCVER
msvc
MSVCR
MSVCRT
msym
mtest
mthumb
mtune
Mula
MULTIVOL
muppetlabs
MWKERKS
myalloc
mydef
mydir
mymkdir
myndkryme
myrec
mytest
mztools
napi
nastygram
ncode
ndist
nds
Necasek
NEEDBITS
negl
nes
nevetheless
newdate
newdir
NEWOBJ
Newsham
Nex
nextlen
Ngth
nicematch
Nieder
Niessink
nihilo
Nikl
Nintendo
nintendods
nlohmann
nmake
NOBYFOUR
noconf
NOCRYPT
noe
nofac
noi
NOICONS
noident
nologo
Nomssi
NONSTDC
noopt
noprefix
Norwitz
nosever
NOSINT
nospan
NOSTACKCHECK
NOSTKCHK
NOSUCHFILE
notdir
notext
notlifo
notw
NOUNCRYPT
NOUNDERLINE
novell
NOVER
NOVERSION
nroff
Nyffenegger
Nzali
Oait
Oberhumer
OBJA
OBJG
OBJPA
OBJZ
obry
oilrtfm
Okt
Oku
Okumura
olb
oldnewthing
olist
oml
ommit
onefile
OOXML
opportunites
OPTALIAS
OPTCOMP
OPTDEP
Opteron
optf
optfile
OPTGO
OPTINL
OPTINLINE
OPTINLOCAL
OPTLOOP
OPTPEEP
OPTRDEP
OPTSCHED
OPTTIME
origlen
oring
orq
Osma
oss
ourselfs
outd
Outercurve
outfun
outhow
outnname
outputresource
ozstream
paag
paches
packcode
palmzlib
parafernalia
PARAMERROR
partcompress
particuarly
pbegin
PByte
PChar
pcmpeqb
Pcn
pcrc
pdflib
Pehrson
pentium
perlfaq
pez
pfile
pfilefunc
pfns
pgcc
PGMLVL
pigz
pkeys
pkgconfig
pkgconfigdir
pkware
pkzip
pmovmskb
pmqs
Pohland
Poltorak
Polushin
popfd
popt
Posf
POSTINC
ppend
PPro
pqdownheap
pqremove
prefetcht
prevlen
procptr
Prouse
psllq
psrlq
ptm
pufftest
puft
PULLBYTE
pushebp
pushebx
pushedi
pushesi
pushf
pushfd
putbackfail
pwinerror
pxor
Pzd
pziinit
pzlib
QDOS
Qing
qmaxmem
qnx
qpg
QPM
QSH
qshell
QSYS
Quines
raiter
randeg
ravn
RAWLEN
rbrown
RCDLEN
RCFLAGS
rdpartysource
rdtsc
readabilty
readin
readmore
READWRITEFILTER
rearchitecting
recived
recomended
recompresses
recompressing
recreting
recsize
redistributable
referece
Reinholdtsen
relativefilepath
remaing
reocmpression
REPZ
resourcestring
rfm
rios
rocksoft
rodgers
rodin
roff
rommable
rpi
RSDS
rsxnt
rtl
rtti
Rudiak
Ruland
RWTH
Rzesniowiecki
Sangwine
sarl
Sarwate
SASC
savefilenameinzip
scanalign
scanalignd
scanend
scanendw
scanstart
scanstartw
Schiffer
Schlafly
Schluper
Schrum
Schwaderer
schwardt
Schweda
scl
SCOPTIONS
scppc
SCRIPTDIR
securityfocus
Senisivity
setcompression
setcompressionlevel
setcompressionstrategy
setfiletime
SFILES
sfx
Shachar
SHAREDLIB
sharedlibdir
SHAREDLIBIMP
SHAREDLIBM
SHAREDLIBV
Shigeo
shll
shlq
shopt
SHORTNAMESIZE
shrl
shrq
Simplfy
simplied
sirena
Sirus
Sitebuilder
SIZECENTRALDIRITEM
SIZECENTRALHEADER
SIZEDATA
sizet
SIZEZIPLOCALHEADER
sjs
slib
Smake
SMakefile
SMALLBUFSIZE
Sobrado
somes
soname
sonda
sourcelen
SOVERSION
spetsified
Squeezeflags
srcdir
srcfil
SRCFILE
SRCMBR
SRCPF
SRCSTMF
SRVPGM
startproc
stat'ing
STATBNDDIR
stategy
STATEm
STATEn
statep
STATEw
STATEx
STEDD
STMF
Stoks
stosb
stosw
strarg
strat
strcmpcasenosensitive
STRCMPCASENOSENTIVEFUNCTION
strcmpi
strend
STRICTUNZIP
STRICTZIP
STRICTZIPUNZIP
STRMERGE
STRPGMEXP
strstart
strtime
structore
subb
sunfreeware
Suport
suppors
suse
Svensson
svn
sync'ed
syncsearch
SYSIFCOPT
systemnotsupported
Tagunz
Tagzip
TAlloc
tarball
TARGETLIB
tarmode
tartime
TASM
taz
TBLS
tcl
TColor
TCompression
tconfig
tcrc
tcsh
TCustom
TDecompression
Technolgies
tempdir
Tencent
Teredesai
Terje
testb
testdll
testerror
TESTFILE
testi
testl
testo
testreuslt
testshared
teststatic
testw
testz
testzlib
Teterin
TFree
TGTCCSID
TGTRLS
tgz
tgzarchive
THL
Thorsen
Thorson
tlib
tmphdrfile
tmpsh
tmpst
tmu
tmz
tmzip
TNotify
TObject
TOCCSID
TOOBJ
TOOFAR
Toolflags
TOPDIR
topt
Torok
Torri
Toshiaki
totin
totout
totsym
Tracec
Tracecv
Tracev
Tracevv
treebuild
Trenly
tristanpenman
trnlnm
Truta
tryboth
TRYFREE
tstream
tttt
TURBOC
txtvsbin
tyge
typedef'ed
typedefed
TYPEDO
ubbcluj
uchf
uder
udpate
ulg
ulongs
uncompr
uncompressing
Uncompression
uncpr
uncpsize
uncrypt
undersubscribed
ungobbled
uninitialised
Unkn
untabify
untgz
unusued
unz
unzeof
unztell
updatewindow
upgradable
usenix
USEWIN
USEWINDOWS
ushf
UTILLIB
UWIN
UXP
vagul
Vainstein
Valgrind
vaxc
vaxcrtl
Vcdfimorst
VCL
vda
VERSIONMADEBY
visualc
vlink
vmap
vmod
vms
vmsdefs
vnocompatwarnings
voidnp
VOLHDR
vollant
vsconfig
vstudio
Walles
Wassenhove
watcom
wbits
wcl
WDK
webdocs
weblogs
websites
Wegner
Weigelt
WFLAGS
whave
WIDECHAR
winapifamily
windowbestlen
windowlen
windres
wingetutil
winimage
winver
winzip
withoutpath
wlib
wmake
wnext
Wojciech
woot
wopen
workflows
wraplen
WRITEBUFFERSIZE
wustl
xarch
xbits
xcode
XFL
xflgs
xlc
xmlmultiple
xorl
xsom
xtarget
xtra
XTSTEP
xvmsutils
xxd
Yakimov
Yasuhiro
ycombinator
Zabolotny
zachary
zbsm
ZCALLBACK
zcat
zclose
zconfh
zconst
zcpr
ZCR
Zcrtdll
zdecode
zdef
zdll
zdoc
zencode
zerr
zerror
zfile
Zfname
zfstream
Zhu
ziinit
zilb
ZINCOUT
zinser
zipcharpc
zipfi
zipfile
zipfilename
zipfilenamearg
ziplib
zipok
zlb
zless
zlibd
zlibdefs
ZLIBIOAPI
zlibpas
zlibrc
zlibstatic
zlibvc
ZLIBWAPI
zmem
zmemcmp
zmemcpy
zmemzero
Znotfound
Zomf
Zouzou
zpipe
ZPOS
zpull
zran
zread
zseek
zstate
zstreamp
ZStreams
zstrerror
zstringlen
zstrm
Zsuffix
ZSWAP
ztell
ztest
Zwin
zwrite
Previously acknowledged words that are now absent acl agg amd anonymized appname arp asm AType badbit Baz bfd bitmask bluetooth brk Browsable Buf BUILTINS CDEF cend certs cgi ci cls Concat cstdint Ctx CYRL Dbg dirs dllimport dw endian enums EQU ERANGE errmsg errno fd fdw FSharp ftp FULLMUTEX FULLWIDTH GES gitlab Google gz hashtable htm idx img inet IObject jp KF Kp langs LATN lhs Lifecycle llvm localhost lw lz memcpy middleware msdn multimap mx nullopt NX openmode Outptr pb pfn pkix pri psd psm px pz qb rbegin readonly rhs RRF rrr SARL semver serializer sid sourceforge SRL standalone streambuf strtoull subkey SUSE textarea timezone transitioning typeof ubuntu uintptr ul UNSCOPED UPSERT uris URLs USHORT utils uuid virtualization vscode vy wcslen website wn Workflows zy :arrow_right:
Some files were automatically ignored

These sample patterns would exclude them:

^\Qsrc/PureLib/pure/AUTHORS\E$
^\Qsrc/PureLib/pure/zlib/contrib/blast/test.pk\E$
^\Qsrc/PureLib/pure/zlib/contrib/blast/test.txt\E$
^\Qsrc/PureLib/pure/zlib/contrib/masmx64/bld_ml64.bat\E$
^\Qsrc/PureLib/pure/zlib/contrib/puff/zeros.raw\E$

You should consider adding them to:

.github/actions/spelling/excludes.txt

File matching is via Perl regular expressions.

To check these files, more of their words need to be in the dictionary than not. You can use patterns.txt to exclude portions, add items to the dictionary (e.g. by adding them to allow.txt), or fix typos.

To accept ✔️ these unrecognized words as correct and remove the previously acknowledged and now absent words, run the following commands

... in a clone of the [email protected]:SirusCodes/winget-cli.git repository
on the #1620-spec branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/v0.0.21/apply.pl' |
perl - 'https://github.com/microsoft/winget-cli/actions/runs/10124267998/attempts/1'
Available 📚 dictionaries could cover words not in the 📘 dictionary

This includes both expected items (477) from .github/actions/spelling/expect.txt and unrecognized words (1399)

Dictionary Entries Covers
cspell:win32/src/win32.txt 53509 30
cspell:mnemonics/src/mnemonics.txt 800 26
cspell:java/java.txt 7642 23
cspell:python/src/python/python-lib.txt 3873 14
cspell:python/src/common/extra.txt 741 10
cspell:r/src/r.txt 808 5
cspell:php/php.txt 2597 5
cspell:python/src/python/python.txt 453 4
cspell:node/node.txt 1768 4
cspell:html/html.txt 1863 3

Consider adding them using (in .github/workflows/spelling3.yml):

      with:
        extra_dictionaries:
          cspell:win32/src/win32.txt
          cspell:mnemonics/src/mnemonics.txt
          cspell:java/java.txt
          cspell:python/src/python/python-lib.txt
          cspell:python/src/common/extra.txt
          cspell:r/src/r.txt
          cspell:php/php.txt
          cspell:python/src/python/python.txt
          cspell:node/node.txt
          cspell:html/html.txt

To stop checking additional dictionaries, add:

      with:
        check_extra_dictionaries: ''
Errors (4)

See the 📂 files view or the 📜action log for details.

❌ Errors Count
ℹ️ binary-file 2
❌ check-file-path 30
❌ forbidden-pattern 18
ℹ️ noisy-file 3

See ❌ Event descriptions for more information.

If the flagged items are false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

@SirusCodes
Copy link
Author

@Trenly @denelon I have updated the spec.

I thought disambiguating each package separately would be a better idea because it will leave out edge cases where a user might filter out the package they wanted to install and go back through this whole process.

@denelon
Copy link
Contributor

denelon commented Sep 18, 2024

@siriusCodes, I've done a readthrough. The spec looks fairly thorough to me. At this point I'd like to get one of the engineers to perform a bit of a sanity check 😊

I'm also thinking we need to reason about what this would imply with the PowerShell way of doing things. I'm not sure it makes sense to have this kind of treatment in PowerShell though, so I'll see if I can get a few folks to look at it and give feedback.

@JohnMcPMS

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants