123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- #!/usr/bin/python2
- # -*- coding: utf-8 -*-
- #
- # Copyright (c) 2017 Mahmut Şamil Avar - milisarge
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy
- # of this software and associated documentation files (the "Software"), to
- # deal in the Software without restriction, including without limitation the
- # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- # sell copies of the Software, and to permit persons to whom the Software is
- # furnished to do so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in
- # all copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- # IN THE SOFTWARE.
- """
- Milis Linux Python Talimat Kütüphanesi - talimat.py
- """
- import sys
- import re
- import os
- import shlex
- import urllib2
- from requests.exceptions import HTTPError
- # Milis linux talimat sınıfı
- class Talimat():
-
- talimatname="/sources/milis.git/talimatname/"
-
- def __init__(self):
- self.tanim=""
- self.url=""
- self.paketci=""
- self.gerekler=[]
- self.isim=""
- self._isim=""
- self.surum=""
- self.devir=""
- self.kaynaklar=[]
- self.derleme="build() {"+"\n"
-
- def ice_aktar(self,dosya,tip):
- if tip=="arch":
- pkgbuild=PKGBUILD(dosya)
- self.tanim=pkgbuild.description
- self.url=pkgbuild.url
- self.paketci="milisarge"
- if hasattr(pkgbuild, 'makedepends'):
- for mgerek in pkgbuild.makedepends:
- if mgerek not in self.gerekler:
- self.gerekler.append(mgerek)
- if hasattr(pkgbuild, 'depends'):
- for gerek in pkgbuild.depends:
- if gerek not in self.gerekler:
- self.gerekler.append(gerek)
- self.isim=pkgbuild.name
- if hasattr(pkgbuild, '_name'):
- self._isim=pkgbuild._name
- self.surum=pkgbuild.version
- self.devir=pkgbuild.release
- self.kaynaklar=pkgbuild.sources
- self._ice_aktar_bloklar(dosya,tip)
- return "tanımlar için gecersiz tip!"
-
- def _gerekler(self):
- gerekstr=""
- for gerek in self.gerekler:
- if os.path.exists(self.talimatname+"temel-ek/"+gerek) is False and os.path.exists(self.talimatname+"temel/"+gerek) is False:
- gerekstr+=gerek+" "
- if os.path.exists(self.talimatname+"genel/"+gerek) is False:
- print renk.uyari+gerek+" talimatı yapılmalı!"+renk.son
- return gerekstr
-
- def _kaynaklar(self):
- kaynakstr=""
- for kaynak in self.kaynaklar:
- kaynakstr+=kaynak+"\n"
- return kaynakstr
-
- def _ice_aktar_bloklar(self,dosya,tip):
- if tip=="arch":
- #bu sekilde de satirlar cekilebilir.
- #lines = [line.rstrip('\n') for line in open(dosya)]
- with open(dosya) as f:
- satirlar = f.readlines()
- blok=False
- onblok=False
- for satir in satirlar:
- if "md5sums=(" in satir or "sha256sums=('" in satir:
- onblok=True
- if onblok is True and "')" in satir:
- blok=True
- continue
- if blok and satir.rstrip()!="" and satir.rstrip()!="}":
- if (satir not in self.derleme) and ("pkgver()" not in satir) and ("prepare()" not in satir) and ("build()" not in satir) and ("package()" not in satir) and ("check()" not in satir):
- satir=satir.replace("pkgdir","PKG")
- satir=satir.replace("srcdir","SRC")
- satir=satir.replace("pkgname","name")
- satir=satir.replace("pkgver","version")
- satir=satir.replace("pkgrel","release")
- self.derleme+=satir+"\n"
- else:
- return "blok için gecersiz tip!"
-
- def olustur(self):
- if self.isim:
- print renk.tamamb+self.isim+" talimatı hazırlanıyor..."+renk.son
- os.system("mkdir -p "+self.isim)
- open(self.isim+"/talimat","w").write(self.icerik())
-
- def icerik(self):
- icerikstr=""
- icerikstr+="# Description: "+self.tanim+"\n"
- icerikstr+="# URL: "+self.url+"\n"
- icerikstr+="# Packager: "+self.paketci+"\n"
- icerikstr+="# Depends on: "+self._gerekler()
- icerikstr+="\n"+"\n"
- icerikstr+="name="+self.isim+"\n"
- if self._isim !="":
- icerikstr+="_name="+self._isim+"\n"
- icerikstr+="version="+str(self.surum)+"\n"
- icerikstr+="release="+str(self.devir)+"\n"
- icerikstr+="source=("+self._kaynaklar()+")"
- icerikstr+="\n"+"\n"
- icerikstr+=self.derleme
- icerikstr+="}"
- return icerikstr
-
- def cevir(self,dosya,tip="arch"):
- self.ice_aktar(dosya,tip)
- self.olustur()
- print renk.tamamy+talimat.isim+" talimatı hazır."+renk.son
-
- # archlinux pkgbuild sınıfı
- #Copyright (c) 2009 Sebastian Nowicki (parched.py)
- class PKGBUILD():
-
- _symbol_regex = re.compile(r"\$(?P<name>{[\w\d_]+}|[\w\d]+)")
- def __init__(self, name=None, fileobj=None):
- self.install = ""
- self.checksums = {
- 'md5': [],
- 'sha1': [],
- 'sha256': [],
- 'sha384': [],
- 'sha512': [],
- }
- self.noextract = []
- self.sources = []
- self.makedepends = []
- # Symbol lookup table
- self._var_map = {
- 'pkgname': 'name',
- '_pkgname': '_name',
- 'pkgver': 'version',
- 'pkgdesc': 'description',
- 'pkgrel': 'release',
- 'source': 'sources',
- 'arch': 'architectures',
- 'license': 'licenses',
- }
- self._checksum_fields = (
- 'md5sums',
- 'sha1sums',
- 'sha256sums',
- 'sha384sums',
- 'sha512sums',
- )
- # Symbol table
- self._symbols = {}
- if not name and not fileobj:
- raise ValueError("nothing to open")
- should_close = False
- if not fileobj:
- fileobj = open(name, "r")
- should_close = True
- self._parse(fileobj)
- if should_close:
- fileobj.close()
- def _handle_assign(self, token):
- var, equals, value = token.strip().partition('=')
- # Is it an array?
- if value[0] == '(' and value[-1] == ')':
- self._symbols[var] = self._clean_array(value)
- else:
- self._symbols[var] = self._clean(value)
- def _parse(self, fileobj):
- """Parse PKGBUILD"""
- if hasattr(fileobj, "seek"):
- fileobj.seek(0)
- parser = shlex.shlex(fileobj, posix=True)
- parser.whitespace_split = True
- in_function = False
- while 1:
- token = parser.get_token()
-
- if token is None or token == '':
- break
- # Skip escaped newlines and functions
- if token == '\n' or in_function:
- continue
- # Special case:
- # Array elements are dispersed among tokens, we have to join
- # them first
- if token.find("=(") >= 0 and not token.rfind(")") >= 0:
- in_array = True
- elements = []
- while in_array:
- _token = parser.get_token()
- if _token == '\n':
- continue
- if _token[-1] == ')':
- _token = '"%s")' % _token.strip(')')
- token = token.replace('=(', '=("', 1) + '"'
- token = " ".join((token, " ".join(elements), _token))
- in_array = False
- else:
- elements.append('"%s"' % _token.strip())
- # Assignment
- if re.match(r"^[\w\d_]+=", token):
- self._handle_assign(token)
- # Function definitions
- elif token == '{':
- in_function = True
- elif token == '}' and in_function:
- in_function = False
- self._substitute()
- self._assign_local()
- if self.release:
- self.release = float(self.release)
- def _clean(self, value):
- """Pythonize a bash string"""
- return " ".join(shlex.split(value))
- def _clean_array(self, value):
- """Pythonize a bash array"""
- return shlex.split(value.strip('()'))
- def _replace_symbol(self, matchobj):
- """Replace a regex-matched variable with its value"""
- symbol = matchobj.group('name').strip("{}")
- # If the symbol isn't found fallback to an empty string, like bash
- try:
- value = self._symbols[symbol]
- except KeyError:
- value = ''
- # BUG: Might result in an infinite loop, oops!
- return self._symbol_regex.sub(self._replace_symbol, value)
- def _substitute(self):
- """Substitute all bash variables within values with their values"""
- for symbol in self._symbols:
- value = self._symbols[symbol]
- # FIXME: This is icky
- if isinstance(value, str):
- result = self._symbol_regex.sub(self._replace_symbol, value)
- else:
- result = [self._symbol_regex.sub(self._replace_symbol, x)
- for x in value]
- self._symbols[symbol] = result
- def _assign_local(self):
- """Assign values from _symbols to PKGBUILD variables"""
- for var in self._symbols:
- value = self._symbols[var]
- if var in self._checksum_fields:
- key = var.replace('sums', '')
- self.checksums[key] = value
- else:
- if var in self._var_map:
- var = self._var_map[var]
- setattr(self, var, value)
- class renk:
- baslik = '\033[95m'
- tamamb = '\033[94m'
- tamamy = '\033[92m'
- uyari = '\033[93m'
- hata = '\033[91m'
- son = '\033[0m'
- kalin = '\033[1m'
- altcizgili = '\033[4m'
- class Arge:
-
- def indir(self,link):
- if "packages/" in link:
- paket=link.split("?h=packages/")[1]
- else:
- paket=link.split("?h=")[1]
- print renk.tamamb+paket+" indiriliyor..."+renk.son
- try:
- veri = urllib2.urlopen(link)
- open(paket+"_pkgbuild","w").write(veri.read())
- return paket+"_pkgbuild"
- except urllib2.HTTPError, e:
- if e.code == 404:
- print renk.hata+link+" bulunamadı!"+renk.son
- return None
-
- def aur_link(self,paket):
- link="https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h="+paket
- return link
-
- def arch2_link(self,paket):
- link="https://git.archlinux.org/svntogit/community.git/plain/trunk/PKGBUILD?h=packages/"+paket
- return link
-
- def arch_link(self,paket):
- link="https://git.archlinux.org/svntogit/packages.git/plain/trunk/PKGBUILD?h=packages/"+paket
- return link
-
-
- if __name__ == '__main__':
-
- if len(sys.argv) > 1:
- dosya=sys.argv[1]
- talimat=Talimat()
- arge=Arge()
- if os.path.exists(dosya):
- talimat.cevir(dosya)
- elif "https" in dosya or "http" in dosya:
- Pdosya=arge.indir(dosya)
- talimat.cevir(Pdosya)
- elif dosya == "-a":
- if len(sys.argv) > 2:
- paket=sys.argv[2]
- paket=str(paket)
- link=arge.aur_link(paket)
- dosya=arge.indir(link)
- if dosya is None:
- link=arge.arch_link(paket)
- dosya=arge.indir(link)
- if dosya is None:
- link=arge.arch2_link(paket)
- dosya=arge.indir(link)
- if link and dosya:
- talimat.cevir(dosya)
- else:
- print renk.hata+dosya+" paremetre bulunamadı!"+renk.son
|