summary refs log tree commit diff stats
path: root/compiler/commands.nim
Commit message (Expand)AuthorAgeFilesLines
* implements a --nep1:on switch to make the compiler enforce the naming convent...Andreas Rumpf2018-06-131-0/+2
* baby steps for incremental compilationAndreas Rumpf2018-05-301-2/+2
* remove more global variables in the Nim compilerAndreas Rumpf2018-05-271-5/+5
* platform.nim doesn't use globals anymore; prepare msgs.nim for not using globalsAndreas Rumpf2018-05-181-19/+17
* preparations of making compiler/msgs.nim free of global variablesAndreas Rumpf2018-05-171-3/+3
* extccomp: no globals anymoreAraq2018-05-161-3/+3
* options.nim: no global variables anymoreAndreas Rumpf2018-05-131-135/+135
* bootstrapping worksAndreas Rumpf2018-05-131-1/+1
* move more global variables into ConfigRefAndreas Rumpf2018-05-111-16/+16
* avoid more global variablesAndreas Rumpf2018-05-111-6/+6
* big refactoring: parser compiles againAndreas Rumpf2018-05-101-269/+266
* remove hardly used TimeMachine featureAndreas Rumpf2018-05-061-2/+1
* Merge pull request #7714 from data-man/show_compile_timestampsDominik Picheta2018-05-031-4/+8
|\
| * Compiler: show compile timestampsdata-man2018-04-281-4/+8
* | Merge branch 'araq-strings-v1' into develAraq2018-04-301-2/+2
|\ \
| * | commands.nim: use let instead of varAndreas Rumpf2018-04-301-2/+2
| |/
* / introduce --laxstrings switch for backwards compatibilityAraq2018-04-301-0/+1
|/
* Fixes #802, #803 and #3775 - genscript issues (#7677)genotrance2018-04-251-0/+1
* refactoring: move 'argument' global into config objectAndreas Rumpf2018-04-241-7/+2
* .experimental can now be used to enable specific featuresAndreas Rumpf2018-04-241-14/+25
* remove dead code elimination option (#7669)Jacek Sieka2018-04-231-2/+1
* refactoring: make FileIndex a distinct type; make line information an uint16;...Andreas Rumpf2018-04-211-1/+1
* replace --advanced by --fullhelp; refs #7621Andreas Rumpf2018-04-201-0/+11
* allow setting template/macro recursive evaluation limits (#7652)jcosborn2018-04-191-1/+0
* Nim namespace for cpp (#7453)AdrianV2018-04-151-0/+5
* the new feature's name is hotCodeReloadingAndreas Rumpf2018-04-131-4/+4
* Support code hot reloading for JavaScript projects (#7362)zah2018-04-131-0/+4
* further steps in implementing sink parameters; refs #7041Araq2018-03-301-0/+2
* disable the undocumented 'import ' feature; allow import std / strutils; fixe...Andreas Rumpf2018-02-121-2/+3
* fixes #7129Andreas Rumpf2018-01-301-1/+1
* fixes #7089Andreas Rumpf2018-01-241-0/+10
* introduce --symbolFiles:v2 as the next attempt to bring symbol files to NimAraq2018-01-111-0/+1
* symbol files: introduce more switches for debuggingAndreas Rumpf2018-01-071-2/+7
* make the new --genDeps feature optional since it makes compilations slowerAndreas Rumpf2017-12-211-1/+1
* add dynlibOverrideAll switch (#6873)Charlie Barto2017-12-061-0/+3
* Do not include date in binaries (#6581)Bernhard M. Wiedemann2017-11-181-2/+2
* Let the environment variable NIMBLE_DIR overrides nimblepath in cfg file (#6542)Xiao-Yong2017-10-281-1/+3
* introduce --newruntime switch for the upcoming destructors and move semanticsAndreas Rumpf2017-10-131-0/+4
* Add missing nilChecks compiling option (#6480)Eduardo Bart2017-10-091-0/+2
* direct `nim --version` to stdout rather than stderr (#6460)Bo Lingen2017-10-021-3/+5
* Make Nim gdb pretty print friendly (#6240)cooldome2017-08-241-0/+1
* WIP: --gc:regions instead of --gc:stackAraq2017-08-131-4/+4
* kill the reportConceptFailures options as it will be replaced by the .explain...Zahary Karadjov2017-03-241-2/+0
* fixes #5228Andreas Rumpf2017-03-181-4/+17
* Merge pull request #5317 from rokups/feature/coroutinesAndreas Rumpf2017-02-261-4/+0
|\
| * Removed fasm support.Rokas Kupstys2017-02-201-4/+0
* | removed compiler internal list implementation (#5371)Arne Döring2017-02-221-6/+8
|/
* refactoring: explict config state instead of globalsAndreas Rumpf2017-02-011-3/+9
* fixes compiler ignoring passC/passL args when setting --cc:compiler. (#5310)Parashurama2017-02-011-2/+2
* .compile pragma supports patterns and actionsAraq2017-01-281-3/+1
le='Blame the previous revision' href='/ahoang/Nim/blame/compiler/babelcmd.nim?h=devel&id=05b05be9f8554adc3081b71eb378940cb75428fd'>^
9b465a236 ^
1dc362dcd ^

61e57cfa1 ^
90fa64501 ^










86556ebfd ^
61e57cfa1 ^
86556ebfd ^
c98696d74 ^
61e57cfa1 ^
1dc362dcd ^




61e57cfa1 ^
1dc362dcd ^
61e57cfa1 ^
1dc362dcd ^
86556ebfd ^


010067f3c ^



bea07a2c5 ^

9b465a236 ^








3999e3be5 ^
bea07a2c5 ^
796aafe7e ^









bea07a2c5 ^
9b465a236 ^
3999e3be5 ^
9b465a236 ^
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

 
                            





                                                   
                                                                           
 
                                                                  
                      
 
                                                                    

                                         
 
    
                            
 
                                          
 
                                        






                                                          



                                          
                                              













                                                               
                                        











                                        
 






                                                                            

                                                                                
                  
                                       




                   




                                
                                

                                       
                                                                                        
                                     





                                                          
                                                        
 
                                                   
                                  
                                                        

             
                                                                 










                                                                                
                                                      
                                       
                                              
 
                                                                




                                                     
                                         
                           
                                
 


                                                                       



                                     

                  








                                                                         
                           
                           









                                                     
 
                              
                                                            
 
#
#
#           The Nim Compiler
#        (c) Copyright 2012 Andreas Rumpf
#
#    See the file "copying.txt", included in this
#    distribution, for details about the copyright.
#

## Implements some helper procs for Nimble (Nim's package manager) support.

import parseutils, strutils, strtabs, os, options, msgs, sequtils,
  lineinfos, pathutils

proc addPath*(conf: ConfigRef; path: AbsoluteDir, info: TLineInfo) =
  if not conf.searchPaths.contains(path):
    conf.searchPaths.insert(path, 0)

type
  Version* = distinct string

proc `$`*(ver: Version): string {.borrow.}

proc newVersion*(ver: string): Version =
  doAssert(ver.len == 0 or ver[0] in {'#', '\0'} + Digits,
           "Wrong version: " & ver)
  return Version(ver)

proc isSpecial(ver: Version): bool =
  return ($ver).len > 0 and ($ver)[0] == '#'

proc isValidVersion(v: string): bool =
  if v.len > 0:
    if v[0] in {'#'} + Digits: return true

proc `<`*(ver: Version, ver2: Version): bool =
  ## This is synced from Nimble's version module.

  # Handling for special versions such as "#head" or "#branch".
  if ver.isSpecial or ver2.isSpecial:
    if ver2.isSpecial and ($ver2).normalize == "#head":
      return ($ver).normalize != "#head"

    if not ver2.isSpecial:
      # `#aa111 < 1.1`
      return ($ver).normalize != "#head"

  # Handling for normal versions such as "0.1.0" or "1.0".
  var sVer = string(ver).split('.')
  var sVer2 = string(ver2).split('.')
  for i in 0..<max(sVer.len, sVer2.len):
    var sVerI = 0
    if i < sVer.len:
      discard parseInt(sVer[i], sVerI)
    var sVerI2 = 0
    if i < sVer2.len:
      discard parseInt(sVer2[i], sVerI2)
    if sVerI < sVerI2:
      return true
    elif sVerI == sVerI2:
      discard
    else:
      return false

proc getPathVersion*(p: string): tuple[name, version: string] =
  ## Splits path ``p`` in the format ``/home/user/.nimble/pkgs/package-0.1``
  ## into ``(/home/user/.nimble/pkgs/package, 0.1)``
  result.name = ""
  result.version = ""

  const specialSeparator = "-#"
  let last = p.rfind(p.lastPathPart) # the index where the last path part begins
  var sepIdx = p.find(specialSeparator, start = last)
  if sepIdx == -1:
    sepIdx = p.rfind('-', start = last)

  if sepIdx == -1:
    result.name = p
    return

  for i in sepIdx..<p.len:
    if p[i] in {DirSep, AltSep}:
      result.name = p
      return

  result.name = p[0..sepIdx - 1]
  result.version = p.substr(sepIdx + 1)

proc addPackage(conf: ConfigRef; packages: StringTableRef, p: string; info: TLineInfo) =
  let (name, ver) = getPathVersion(p)
  if isValidVersion(ver):
    let version = newVersion(ver)
    if packages.getOrDefault(name).newVersion < version or
      (not packages.hasKey(name)):
      packages[name] = $version
  else:
    localError(conf, info, "invalid package name: " & p)

iterator chosen(packages: StringTableRef): string =
  for key, val in pairs(packages):
    let res = if val.len == 0: key else: key & '-' & val
    yield res

proc addNimblePath(conf: ConfigRef; p: string, info: TLineInfo) =
  var path = p
  let nimbleLinks = toSeq(walkPattern(p / "*.nimble-link"))
  if nimbleLinks.len > 0:
    # If the user has more than one .nimble-link file then... we just ignore it.
    # Spec for these files is available in Nimble's readme:
    # https://github.com/nim-lang/nimble#nimble-link
    let nimbleLinkLines = readFile(nimbleLinks[0]).splitLines()
    path = nimbleLinkLines[1]
    if not path.isAbsolute():
      path = p / path

  if not contains(conf.searchPaths, AbsoluteDir path):
    message(conf, info, hintPath, path)
    conf.lazyPaths.insert(AbsoluteDir path, 0)

proc addPathRec(conf: ConfigRef; dir: string, info: TLineInfo) =
  var packages = newStringTable(modeStyleInsensitive)
  var pos = dir.len-1
  if dir[pos] in {DirSep, AltSep}: inc(pos)
  for k,p in os.walkDir(dir):
    if k == pcDir and p[pos] != '.':
      addPackage(conf, packages, p, info)
  for p in packages.chosen:
    addNimblePath(conf, p, info)

proc nimblePath*(conf: ConfigRef; path: AbsoluteDir, info: TLineInfo) =
  addPathRec(conf, path.string, info)
  addNimblePath(conf, path.string, info)
  let i = conf.nimblePaths.find(path)
  if i != -1:
    conf.nimblePaths.delete(i)
  conf.nimblePaths.insert(path, 0)

when isMainModule:
  proc v(s: string): Version = s.newVersion
  # #head is special in the sense that it's assumed to always be newest.
  doAssert v"1.0" < v"#head"
  doAssert v"1.0" < v"1.1"
  doAssert v"1.0.1" < v"1.1"
  doAssert v"1" < v"1.1"
  doAssert v"#aaaqwe" < v"1.1" # We cannot assume that a branch is newer.
  doAssert v"#a111" < v"#head"

  let conf = newConfigRef()
  var rr = newStringTable()
  addPackage conf, rr, "irc-#a111", unknownLineInfo
  addPackage conf, rr, "irc-#head", unknownLineInfo
  addPackage conf, rr, "irc-0.1.0", unknownLineInfo
  #addPackage conf, rr, "irc", unknownLineInfo
  #addPackage conf, rr, "another", unknownLineInfo
  addPackage conf, rr, "another-0.1", unknownLineInfo

  addPackage conf, rr, "ab-0.1.3", unknownLineInfo
  addPackage conf, rr, "ab-0.1", unknownLineInfo
  addPackage conf, rr, "justone-1.0", unknownLineInfo

  doAssert toSeq(rr.chosen) ==
    @["irc-#head", "another-0.1", "ab-0.1.3", "justone-1.0"]