একটি ভেন্টু সিস্টেমে কীওয়ার্ড ফাইলটি কীভাবে পরিষ্কার করবেন?


10

gentoo stableনিম্নলিখিত সিস্টেমে কীওয়ার্ড তালিকার সাথে একটি লাইন যুক্ত করে কেউ সিস্টেমে টেস্টিং প্যাকেজগুলি নির্বাচন করতে পারেন :

cat /etc/portage/package.keywords

=dev-python/ipython-0.13.2 ~amd64
# and many lines later
=dev-python/ipython-0.14.1 ~amd64
# and many lines later
>=dev-python/ipython-0.13.4 ~amd64

এই ফাইলটি সময়ের মধ্যে বৃদ্ধি পাবে এবং তাড়াতাড়ি বা পরে কেউ মনে করতে পারে না কোন লাইনগুলি অপ্রচলিত।

আমি সময়ে সময়ে স্ক্রিপ্ট দিয়ে কীভাবে তালিকাটি গুছিয়ে রাখতে পারি?

একটি লাইন মুছে ফেলা উচিত,

  • যদি পরীক্ষার সংস্করণটি ইতিমধ্যে স্থিতিশীল হয়
  • > = একই প্যাকেজের জন্য ব্যবহৃত হয়েছিল
  • = ছোট সংস্করণ নম্বর সহ একই প্যাকেজের জন্য ব্যবহৃত হয়েছিল

আপনি যদি এখনও এটি দেখেন তবে আমার উত্তর দেখুন।
eyoung100

উত্তর:


6

অ্যাপ-পোর্টেজ / পোর্টপেক নামে এই কাজের জন্য এখন একটি অফিসিয়াল প্যাকেজ রয়েছে

এটা হতে পারে

  • অপ্রচলিত USE পতাকা এবং সন্ধান করুন
  • অপ্রচলিত কীওয়ার্ডস এবং
  • ফাইলগুলি পরিষ্কার করুন, যদি -f(ফিক্স) প্যারামিটার হিসাবে যুক্ত করা হয়।

3

আমি একটি ছোট অজগর লিপি লিখেছি যা এই সমস্যার যত্ন নেয়। যুক্তিবিজ্ঞান ফাইলে প্রতিটি লাইনে এ দেখায় package.accept_keywordsএবং শুধুমাত্র যে সব লাইন দিয়ে শুরু উপর কাজ করে =বা <=। এই রেখাগুলির সর্বাধিক সীমাবদ্ধ সংস্করণ রয়েছে তাই সেগুলির আর প্রয়োজন হয় কিনা তা আমরা পরীক্ষা করতে পারি। কোনও বাছাইকারী বা একটি ছাড়া লাইনগুলি >=যেমন রয়েছে তেমনি আমরা জানি না যে তারা অপ্রচলিত কিনা।

আমরা যে লাইনের বিষয়ে যত্নশীল সেগুলি পরে বিশ্লেষণ করা হয় এবং প্যাকেজের ইনস্টল করা সংস্করণটি চেক করা হয়। যদি ইনস্টল করা সংস্করণটি কীওয়ার্ডযুক্ত সংস্করণের চেয়ে নতুন হয় বা এটি আর ইনস্টল না করা হয় তবে কীওয়ার্ডটি অচল মনে করা হয়। যদি ইনস্টল করা প্যাকেজটি কীওয়ার্ড সংস্করণ হিসাবে একই সংস্করণ হয় তবে ইনস্টল করা প্যাকেজটি কীওয়ার্ড করা আছে কিনা তা পরীক্ষা করে নেওয়া হয়। এটি স্থিতিশীল করা থাকলে, লাইনটি অপ্রচলিত হয়, অন্যথায় এটি বজায় রাখা হয়।

#!/bin/env python

import re
import portage

vartree = portage.db[portage.root]['vartree']

with open('/etc/portage/package.accept_keywords') as f:
    for x in f:
        # eat newline
        x = x.rstrip()
        # we only want lines with a bounded max version
        if re.match('^(=|<=)',x):
            # get the package cpv atom -- strip the =|<= and the trailing keyword(s)
            cpv_masked = re.sub('[<=]','',x.split(' ',1)[0])
            cat, pkg, ver, rev = portage.catpkgsplit(cpv_masked)
            # get cpv for all installed versions of the package
            cpv_installed = vartree.dep_match(cat+'/'+pkg)
            for cpv in cpv_installed:
                cmp = portage.pkgcmp(portage.pkgsplit(cpv), portage.pkgsplit(cpv_masked))
                # if the installed version is not newer than the masked version
                if (cmp <= 0):
                    # check if this version is still keyworded
                    cpv_keywords = vartree.dbapi.aux_get(cpv, ['KEYWORDS'])
                    # keep keyword if the package has no keywords (**)
                    if not cpv_keywords[0]:
                        print(x)
                        break
                    # check if the installed package is still keyworded
                    for cpv_keyword in cpv_keywords[0].split(' '):
                        if cpv_masked_keyword == cpv_keyword:
                            # it is, keep the atom and move on to the next one
                            print(x)
                            break                    
        else:
            # keep atoms that have an unbounded max version
            print(x)

এটি নতুন কীওয়ার্ড ফাইলটি স্ট্যান্ডার্ড আউটে মুদ্রণ করবে। দ্রষ্টব্য : আউটপুটটিকে পুনরায় পুনর্নির্দেশ করবেন না /etc/portage/package.accept_keywordsবা আপনি ফাইলটি ক্লোবার করবেন এবং সমস্ত কিছু হারাবেন।

এটি আপনার কীওয়ার্ড ফাইল পরিষ্কার করতে এবং আপনার অন্যান্য উদ্বেগের জন্য, ফাইলটি বাছাই করা এবং তারপরে একই প্যাকেজের জন্য একাধিক লাইনের জন্য পরীক্ষা করা অনেকাংশে যা বাকী রয়েছে তা সমাধানে সহায়তা করবে।


1

আপনি জানেন যে আপনি প্যাকেজ রূপান্তর করতে পারেন। * ডিরেক্টরি ফাইল, ডান?

তারপরে আপনি আপনার পরমাণুগুলি কয়েকটি ফাইলে সংগঠিত করতে পারেন, উদাহরণস্বরূপ, আমার সিস্টেমে আমি নিম্নলিখিতটি পেয়েছি (ভাল, সত্যিই নয়, আমি এখন আমার ল্যাপটপে নেই But তবে আপনি ধারণাটি পেতে পারেন):

/etc/portage/package.keywords:
  package.keywords
  qt5.keywords
  xfce.keywords

/etc/portage/package.use:
  package.use
  qt5.use
  xfce.use

প্রভৃতি

ফাইলগুলি হালনাগাদ করতে আমাকে সহায়তা করতে এটি সত্যই দরকারী বলে মনে করেছি।


0

ইকরাভের উত্তরে যুক্ত করা:

ব্যবহারের পরে eix -tT, তুলনা অপারেটর এবং প্যাকেজ সংস্করণ নম্বর সরান। আপনার ফাইলটিও এইভাবে লেখা যেতে পারে:

dev-python/ipython ~amd64
# and many lines later
package-cat/package ~arch

এই গ্যারান্টি করবে আপনি সবসময় পরীক্ষার সংস্করণ পাবেন dev-python/ipythonএবংpackage-cat/package


~amd64আমার প্রশ্ন বিভ্রান্তিকর হতে পারে। সংস্করণ নম্বরগুলি অচেনা থাকা উচিত। আমি সর্বদা সর্বশেষতম সংস্করণটি পেতে চাই না, তবে অপ্রয়োজনীয় লাইনগুলি খুঁজে পাই।
জোনাস স্টেইন

সংস্করণ ছাড়াই প্যাকেজটি ব্যবহার করা সদৃশ এন্ট্রিগুলি সরিয়ে দেয়। প্যাকেজ এ বিবেচনা করুন> = প্যাকেজ সি সংস্করণ 1.0.0, এবং প্যাকেজ বি এর সি সংস্করণ 1.0.1 প্রয়োজন। অনুশীলনে, প্যাকেজ A এবং B উভয়ই 1 এর চেয়ে বড় সংস্করণ দ্বারা সন্তুষ্ট এবং যদি সমস্ত সংস্করণ> 1.0.0 ~ আর্কে থাকে তবে সংস্করণ সংখ্যা অপ্রাসঙ্গিক। এটির সমাধানের একমাত্র অন্য উপায় হ'ল প্যাকেজ সি এর সমস্ত সংস্করণটি মাস্ক করে পোর্টেজ ওয়ার্ল্ড আপডেটের পরে সর্বশ্রেষ্ঠ সংস্করণটি আনমস্ক করা।
eyoung100

আমি পুরানো স্কুল, এবং আমি নিজেই আমার সমস্ত পোর্টেজ কনফিগারেশন ফাইলগুলি সম্পাদনা করি, মূলত কারণ পোর্টেজ স্বয়ংক্রিয়ভাবে এটি করার আগে আমি কীভাবে এটি করতে শিখেছি। আপনার সদৃশ হওয়ার কারণটি হ'ল কারণ কোনও নতুন সংস্করণ কোনও পুরানো সংস্করণকে ছাড়িয়ে দিলে পোর্টেজ লাইনটি সরাবে না।
eyoung100

0

এখানে একটি ছোট স্ক্রিপ্ট রয়েছে যা /etc/portage/package.* ফাইলগুলি থেকে আর ফিল্টার করা হয় যা আর ইনস্টল করা নেই। অতিরিক্তভাবে এটি সরানো প্রবেশের উপরে সরাসরি সমস্ত মন্তব্য লাইনগুলি সরিয়ে দেয়। (যেমন স্বতঃমাস্ক দ্বারা উত্পন্ন)। মন্তব্যগুলি যদি একটি ফাঁকা রেখার দ্বারা পৃথক করা হয় তবে এটি কেবল নীচের মন্তব্যগুলি সরিয়ে ফেলবে। স্ক্রিপ্টটি সদৃশ এন্ট্রিগুলি সরিয়ে দেয় না।

দয়া করে নোট করুন যে পোর্টেজ- ইউটিসগুলি ইনস্টল করা দরকার এবং এই স্ক্রিপ্টটি কাজ করার জন্য পোস্টসিএন হুক /etc/portage/postsync.d/q-reinitialize অবশ্যই সক্রিয় করতে হবে।

#!/usr/bin/env python3

import argparse
import sys
import os
from subprocess import call
import contextlib

if __name__ != '__main__':
    raise Exception("ust be used as a main module with a parameter as the input file")

parser = argparse.ArgumentParser(description="cleanup /etc/portage/package.* files")
parser.add_argument("infile", help="an input file to clean")
parser.add_argument("--out", dest="outfile", help="the output is written to this file. if not specified, the output is written to stdout.")
parser.add_argument("--inplace", action='store_true', help="overwrite the in file. if specified, --out is ignored.")

args = parser.parse_args()

def checkInstalled(package):
    with open(os.devnull, 'w') as devnull:
        status = call('qlist -IC "' + str(package.split()[0].strip()) + '"', shell=True, stdout=devnull)
        return status == 0

@contextlib.contextmanager
def getOutFile(args):
    if args.inplace:
        fh = open(args.infile, 'w')
    elif args.outfile != None:
        fh = open(args.outfile, 'w')
    else:
        fh = sys.stdout
    try:
        yield fh
    finally:
        if fh is not sys.stdout:
            fh.close()

commentBuffer = []
lines = []

with open(args.infile, 'r') as f:
    lines = f.readlines()

with getOutFile(args) as out:
    for line in lines: 
        if line.lstrip().startswith("#"):
            commentBuffer.append(line)
        else:
            if line.strip() == "" or checkInstalled(line):
                if  commentBuffer:
                    out.write("".join(commentBuffer))
                out.write(line)
            commentBuffer = []

0

এখন হিসাবে, app-portage/eixপ্যাকেজটি একটি কার্যকর সরঞ্জামeix-test-obsolete প্রস্তাব করে । এর থেকে একটি সংক্ষিপ্ত বিবরণ eix-test-obsolete -h:

Usage: eix-test-obsolete [options] detail|brief|quick
  This is a wrapper script for eix (eix 0.33.5).

It calls eix -tTc several times with various variable settings in order to
display missing packages or packages with obsolete entries in
/etc/portage/package.* in a more organized manner than eix -tTc would do alone.

এটি /etc/portage/package.*ফাইলগুলিতে সমস্ত অপ্রয়োজনীয় এন্ট্রিগুলির একটি দুর্দান্ত ভাল ওভারভিউ দেয় । কেবলমাত্র আমি ব্যক্তিগতভাবে নিখোঁজ হচ্ছি তা হুবহু আনমাস্ক / ব্যবহার / গ্রহণ / যা কিছু যাচাই করে ঠিক ফাইল এবং লাইন সম্পর্কে তথ্য। তবে, grep -nrসেই ক্ষেত্রে সহায়তা করে।

$ eix-test-obsolete -c
No non-matching entries in /etc/portage/package.keywords
No non-matching entries in /etc/portage/package.accept_keywords
No non-matching entries in /etc/portage/package.mask
No non-matching entries in /etc/portage/package.unmask
No non-matching or empty entries in /etc/portage/package.use
No non-matching or empty entries in /etc/portage/package.env
No non-matching or empty entries in /etc/portage/package.license
No non-matching or empty entries in /etc/portage/package.accept_restrict
No non-matching or empty entries in /etc/portage/package.cflags
The names of all installed packages are in the database.

Redundant in /etc/portage/package.{,accept_}keywords:

... considered as REDUNDANT_IF_NO_CHANGE
[I] app-accessibility/at-spi2-core (2.26.2(2)@11/30/2018): D-Bus accessibility specifications and registration daemon
[I] app-emulation/runc (1.0.0_rc5_p20180509@11/29/2018): runc container cli tools
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset
[I] sys-process/tini (0.18.0@11/29/2018): A tiny but valid init for containers
[1] "go-overlay" /var/db/repos/go-overlay

Found 4 matches


Not installed but in /etc/portage/package.{,accept_}keywords:
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset

No  redundant  entries in /etc/portage/package.mask
No uninstalled entries in /etc/portage/package.mask
No  redundant  entries in /etc/portage/package.unmask
No uninstalled entries in /etc/portage/package.unmask
Skipping check:  redundant  entries in /etc/portage/package.use
Skipping check: uninstalled entries in /etc/portage/package.use
Skipping check:  redundant  entries in /etc/portage/package.env
Skipping check: uninstalled entries in /etc/portage/package.env
No  redundant  entries in /etc/portage/package.license
No uninstalled entries in /etc/portage/package.license
No  redundant  entries in /etc/portage/package.accept_restrict
No uninstalled entries in /etc/portage/package.accept_restrict
Skipping check:  redundant  entries in /etc/portage/package.cflags
Skipping check: uninstalled entries in /etc/portage/package.cflags

Installed packages with a version not in the database (or masked):
[U] www-client/firefox (60.3.0-r1@12/01/2018 -> 60.4.0^d): Firefox Web Browser

-1

দিয়ে শুরু eix -tTapp-portage/eixএটি পেতে ইনস্টল করুন ।


Eix -tT কীভাবে এটি সমাধান করে তা আমি বুঝতে পারি না। আপনি কিছুটা আরও ব্যাখ্যা করতে পারেন দয়া করে?
জোনাস স্টেইন

আমি মনে করি আপনাকে কিছু আউটপুট পেস্টবিন করতে হবে এবং আপনি বোঝেন না এমন অংশগুলির লাইন সংখ্যাটি নির্দেশ করতে হবে।
lkraav

আমি আরও তথ্য থাকতে ইচ্ছুক । এটি "টিপস এবং কৌশল" বাড়ে এবং মূল ব্লগ পোস্টের লিঙ্কটি মারা গেছে। এটি কিছুটা সাহায্য করে। প্যাকেজ সাম্প্রতিক সক্রিয় করা হয়েছে। হোমপেজ লিঙ্কটি eix.berlios.de এ নির্দেশ করে তবে এটি বিদ্যমান নেই doesn't অনলাইনে (সমস্ত বিকল্প সহ) ম্যানপেজ কোথায়?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.